首页 > 解决方案 > DRF 序列化程序检查未定义字段

问题描述

我曾经drf并且也曾经serializer用来检查用户输入。

这是我的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' 而只是传递数据。

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

谢谢。

标签: djangodjango-rest-framework

解决方案


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

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

在这里,它将检查是否有任何额外的字段通过序列化程序并与现有字段进行比较。如果它存在,那么它将抛出错误(或 make is_valid() == false)。有关更多信息,您可以查看此答案


推荐阅读