django serializer validate field 方法错误解释

django serializer validate field method wrong interpretation

我的结论应该是错误的,但我不能换个方式理解。 使用此模型:

class ExampleSerializer(serializers.Serializer):
    field = serializers.CharField()

通常 django 在使用模型之前会自行检查字段,因此您不能将 c_field 用作整数,因为它是一个字符字段。

现在,我想添加自定义验证:

class ExampleSerializer(serializers.Serializer): 字段 = serializers.CharField()

def validate_field(self, data):
    if data == 'correct':
          return 'good'
    else:
          raise serializers.ValidationError('wrong data')

对我来说,这应该是正确的使用方式,它在该字段中添加了另一个 'validation',但我看到它一直以这种方式使用:

class ExampleSerializer(serializers.Serializer): 字段 = serializers.CharField()

def validate_field(self, data):
    if data == 'correct':
          return {'data': data}

我不明白,因为,returns有些不同,如果你检查它:

res = serializer.ExampleSerializer(data={'field': 'field_char'})
res.is_valid()
res.data

现在数据是字典... 这是我不明白的,你可以改变它,所以任何看到序列化器的人都会感到困惑(如果你有很多验证器,你需要寻找正确的验证器来理解正在发生的事情),以及它的名字感到困惑,因为它是 'validate',而不是 'read_modify' 或其他什么。

所以,我认为这是另一种我无法找到和理解的解释。有什么想法吗?

说明

您的第一个用例应该是首选方式。通过在具有 validate_<field_name> 名称的序列化程序中实现一个方法来使用自定义 field-level 验证,应该 return 与实际字段的数据类型相同。可以找到更多详细信息 here

这段代码的原因

res = serializer.ExampleSerializer(data={'field': 'field_char'})
res.is_valid()
res.data

return与您预期的不同是因为您访问了错误的属性。

  • .data 是将被序列化为 JSON.
  • 的值
  • .validated_data 是将被反序列化为 python 对象的值。这意味着通过序列化程序中的 validate_<field_name> 方法从 field-level 验证中 returned 的值将是 .validated_data.
  • 中字段的值

备注

如果你想在不改变值的情况下对单个字段执行多次验证,你应该使用 validators