передать параметр URL в сериализатор - PullRequest
0 голосов
/ 04 марта 2019

Предположим, мой URL-адрес: POST : /api/v1/my-app/my-model/?myVariable=foo

Как передать myVariable в сериализатор?

# serializer.py
class MySerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = MyModel

    def custom_validator(self):
        # how can i get the "myVariable" value here?
        pass

    def validate(self, attrs):
        attrs = super().validate(attrs)
        self.custom_validator()
        return attrs


# views.py
class MyViewset(ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете получить доступ к переменной через request.query_params атрибут

Как это возможно через сериализатор?

ModelViewSet класс, передающий объект request и view объекту сериализатору как контекстные данные сериализатора , и он доступен в сериализаторе в context переменная

Метод 1: напрямую использовать объект request в сериализаторе

# serializer.py
class MySerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = MyModel

    <b>def custom_validator(self):
        request_object = self.context['request']
        myVariable = request_object.query_params.get('myVariable')
        if myVariable is not None:
            # use "myVariable" here
            pass</b>

    def validate(self, attrs):
        attrs = super().validate(attrs)
        self.custom_validator()
        return attrs


Метод 2: переопределить get_serializer_context()метод

# serializer.py
class MySerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = MyModel

    <b>def custom_validator(self):
        myVariable = self.context['myVariable']
        #use "myVariable" here</b>

    def validate(self, attrs):
        attrs = super().validate(attrs)
        self.custom_validator()
        return attrs


# views.py
class MyViewset(ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MySerializer

    <b>def get_serializer_context(self):
        context = super().get_serializer_context()
        context.update(
            {
                "myVariable": self.request.query_params.get('myVariable')
            }
        )
        return context</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...