将 url 参数传递给序列化程序

Joh*_*ter 6 python django django-rest-framework

假设我的网址是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
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 13

您可以通过request.query_params属性访问变量

如何通过序列化程序实现?

将对象和对象作为序列化器上下文数据ModelViewSet传递给序列化器的类,并且可以在序列化器中的变量中 访问它requestviewcontext

方法一:直接使用request序列化器中的对象

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

    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

    def validate(self, attrs):
        attrs = super().validate(attrs)
        self.custom_validator()
        return attrs
Run Code Online (Sandbox Code Playgroud)


方法 2:覆盖get_serializer_context()方法

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

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

    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

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context.update(
            {
                "myVariable": self.request.query_params.get('myVariable')
            }
        )
        return context
Run Code Online (Sandbox Code Playgroud)