DRF序列化程序检查未定义字段

时间:2019-02-19 05:34:38

标签: django django-rest-framework

我使用了drf,也使用了serializer来检查用户输入。

这是我的序列化程序。py

class BoardSerializer(serializers.Serializer):
    user_id = serializers.IntegerField(required=True)
    body = serializers.CharField(required=False)

并像这样使用它。

serializer = BoardSerializer(data=request.data)
if serializer.is_valid():
     ....

似乎没有检查未定义的字段。

例如,如果我请求{'user_id':1, 'body': 'abc', 'akak': 1}

is_valid()不会捕获字段“ akak”,而只是传递数据。

是否有任何功能可以验证是否在序列化程序中定义了字段?

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以像这样更新验证方法:

class BoardSerializer(serializers.Serializer):
    user_id = serializers.IntegerField(required=True)
    body = serializers.CharField(required=False)

    def validate(self, attrs):
        unknown =  set(self.initial_data) - set(self.fields)
        if unknown:
            raise serializers.ValidationError("Unknown field(s): {}".format(", ".join(unknown)))
        return attrs

在这里,它将检查是否有多余的字段通过序列化程序并与现有字段进行比较。如果存在,则将引发错误(或使is_valid() == false)。有关更多信息,您可以检查此so answer

答案 1 :(得分:0)

因为在 BoardSerializer

中未定义 akak

您需要在序列化程序中添加akak。

您可以在Seralizer中添加自定义字段akak

要捉襟见肘,试试这个

request.data.get('akak')

答案 2 :(得分:0)

是否应该在模型中创建akak字段,所以必须在序列化程序中定义模型。

class BoardSerializer(ModelSerializer):
    user_id = serializers.IntegerField(required=True)
    body = serializers.CharField(required=False)

    class Meta:
       model = your-model
相关问题