Django Rest框架序列化器-如何允许可选字段在无效时被忽略?



我有一个用例,目标是开发人员向我的API发送额外的数据。我希望我的API通过Django Rest框架序列化器验证有一个严格的类型系统。但是,如果用户发送部分无效的数据,如果字段是可选的,我希望忽略该数据,而不是返回400响应。例如,考虑一个键值标记字段

tags = serializers.DictField(child=serializers.CharField(), required=False)

标签字段的有效数据可能看起来像{"foo": "bar"}。无效数据可能看起来像{"foo": "bar", "invalid": {{"some": "object"}},作为& Invalid "的值是一个对象而不是字符串。DRF is_valid将认为这是无效的。Validated_data将不会被填充。

> serializer.is_valid()
False
> serializer.validated_data
{}

因为这个字段不是必需的,而其他标签可能是有效的,所以我希望返回这个

> serializer.is_valid()
True
> serializer.validated_data
{'another_field': 'a', 'tags': [{'foo': 'bar']}

是否有一种方法可以使可选字段忽略无效数据,而不是使整个序列化器无效,同时仍然使用Django Rest框架序列化器并受益于执行的其他验证和规范化?

您可以通过覆盖run_child_validation(...)来创建自定义字段方法

class CustomDictField(serializers.DictField):
def run_child_validation(self, data):
result = {}
for key, value in data.items():
key = str(key)
try:
result[key] = self.child.run_validation(value)
except serializers.ValidationError:
pass

return result

In [2]: data = {"test": {"foo": "bar", "invalid": {"some": "object"}}}
In [3]: s = TestSerializer(data=data)
In [4]: s.is_valid()
Out[4]: True
In [5]: s.validated_data
Out[5]: OrderedDict([('test', {'foo': 'bar'})])

最新更新