我的结论应该是错误的,但我无法用另一种方式理解这一点。使用此型号:
class ExampleSerializer(serializers.Serializer):
field = serializers.CharField()
通常,django在处理模型之前会自己检查字段,所以不能将c_field用作interger,因为它是一个char字段。
现在,我想添加自定义验证:
类ExampleSerializer(serializers.Serializer(:字段=序列化程序。CharField((
def validate_field(self, data):
if data == 'correct':
return 'good'
else:
raise serializers.ValidationError('wrong data')
对我来说,这应该是正确的使用方式,它为该字段添加了另一个"验证",但我看到它一直在以这种方式使用:
类ExampleSerializer(serializers.Serializer(:字段=序列化程序。CharField((
def validate_field(self, data):
if data == 'correct':
return {'data': data}
我不明白,因为,如果你用检查,它会返回不同的东西
res = serializer.ExampleSerializer(data={'field': 'field_char'})
res.is_valid()
res.data
现在数据是一条格言。。。我不明白的是,你可以更改它,所以任何看到序列化程序的人都会感到困惑(如果你有很多验证器,你需要寻找正确的验证器来了解发生了什么(,以及它的名称,因为它是"validate",而不是"read_modify"或其他什么。
所以,我认为这是另一种我无法找到和理解的解释。知道吗?
说明
您的第一个用例应该是首选方式。通过在具有validate_<field_name>
名称的序列化程序中实现方法来使用自定义字段级验证,应该返回与实际字段相同的数据类型。更多详细信息可以在这里找到。
这个代码的原因
res = serializer.ExampleSerializer(data={'field': 'field_char'})
res.is_valid()
res.data
由于访问了错误的属性,返回的内容与您期望的内容不同。
.data
是将被序列化为JSON的值.validated_data
是将被反序列化为python对象的值。这意味着通过序列化程序中的validate_<field_name>
方法从字段级验证返回的值将是.validated_data
中某个字段的值
注释
如果您想在不改变值的情况下对单个字段执行多次验证,则应使用validators