【问题标题】:DRF serializer check undefined fieldDRF 序列化程序检查未定义字段
【发布时间】:2019-07-12 13:21:09
【问题描述】:

我使用了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' 而只是传递数据。

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

谢谢。

【问题讨论】:

标签: django django-rest-framework


【解决方案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

【讨论】:

  • 正是我想要的。谢谢!
【解决方案2】:

因为 akak 没有在 BoardSerializer

中定义

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

您可以在序列化程序中添加自定义字段 akak

要抓住 akak,试试这个

request.data.get('akak')

【讨论】:

  • 我的意思是,我想验证用户输入是否在序列化程序中有未定义的字段。
  • @Hide 你的未定义字段是否已修复
【解决方案3】:

您是否应该在模型中创建 akak 字段,因此您必须在序列化程序中定义您的模型。

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

    class Meta:
       model = your-model

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多