gpt4 book ai didi

python - 如何使 rest_framework 序列化程序不允许多余的字段?

转载 作者:太空狗 更新时间:2023-10-29 18:31:33 25 4
gpt4 key购买 nike

我注意到 Serializer 在拒绝带有未知字段的输入时并不是很严格:

In [1]: from rest_framework import serializers

In [2]: class TestSerializer(serializers.Serializer):
...: foo = serializers.CharField()
...:

In [3]: s = TestSerializer(data=dict(foo='foo', bar='bar'))

In [4]: s.is_valid()
Out[4]: True

有没有办法配置 Serializer 在这种情况下返回关于 bar 意外的验证错误?

最佳答案

这绝对有效:

class TestSerializer(serializers.Serializer):
foo = serializers.CharField()

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

嵌套和列表序列化程序

如果您使用这样的序列化器作为另一个序列化器中的字段,这将不起作用。在这种情况下,子序列化程序将无法访问初始数据,您将得到一个异常。

ListSerializer(或 many=True)相同,因为列表序列化器的子序列化器不会获取单独的 initial_data 项(有是 github ticket 的)。

在那种情况下,适用于所有这两种情况的不太干净的解决方案是:

from rest_framework.fields import empty
from rest_framework.settings import api_settings

class TestSerializer(serializers.Serializer):
foo = serializers.CharField()

def run_validation(self, data=empty):
if data is not empty:
unknown = set(data) - set(self.fields)
if unknown:
errors = ["Unknown field: {}".format(f) for f in unknown]
raise serializers.ValidationError({
api_settings.NON_FIELD_ERRORS_KEY: errors,
})

return super(TestSerializer, self).run_validation(data)

关于python - 如何使 rest_framework 序列化程序不允许多余的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22352960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com