class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
"""
Serializer for task
"""
def validate_title(self, data):
if not data.get('title'):
raise serializers.ValidationError('Please set title')
return data
在 Post 时不调用验证函数,还有我如何给 ChildSerializer 自定义错误,
最佳答案
我遇到了一个类似的问题,我的自定义验证字段没有被调用。我写它是为了绕过不正确的 DRF 验证(下面显示了更多详细信息,但不是答案所必需的)。
查看 DRF 源代码后,我发现了我的问题:DRF 总是先使用其代码验证您的字段,然后再使用您的自定义代码进行验证。
''' rest-framework/serializers.py '''
for field in fields:
validate_method = getattr(self, 'validate_' + field.field_name, None)
primitive_value = field.get_value(data)
try:
# DRF validation always runs first!
# If DRF validator throws, then custom validation is not called
validated_value = field.run_validation(primitive_value)
if validate_method is not None:
# this is your custom validation
validated_value = validate_method(validated_value)
except ValidationError as exc:
errors[field.field_name] = exc.detail
except DjangoValidationError as exc:
errors[field.field_name] = get_error_detail(exc)
回答:自定义验证器不能用于绕过 DRF 的验证器,因为它们总是先运行并在您说它有效之前引发异常。
(对于那些感兴趣的人,我遇到的验证错误是这样的:ModelSerializer used for ModelA,它与 ModelB 具有 OneToOne 关系。ModelB 的 pk 有一个 UUID。DRF 抛出错误 '53abb068-0286- 411e-8729-0174635c5d81' 不是有效的 UUID。
验证时,这是不正确的,真令人气愤。)
关于python - 序列化程序验证函数未调用 DRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49400426/