序列化程序验证函数不称为DRF

2024-05-15 20:47:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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时未调用Validate函数,我如何向ChildSerializer提供自定义错误


Tags: childfieldsfortaskdatamodeltitleall
2条回答

我遇到了一个类似的问题,我的自定义验证字段没有被调用。我写这篇文章是为了绕过一个错误的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用于ModelA,它与ModelB有一对一的关系。ModelB的pk有一个UUID。DRF在验证时抛出错误'53abb068-0286-411e-8729-0174635c5d81' is not a valid UUID.,这是不正确的,非常令人恼火。)

ParentSerializer验证方法存在一些问题。假设您的ParentSerializer模型中有一个title字段。对于字段级验证,您将获得字段而不是整个数据。即validate_title函数应该将title(数据的标题字段)作为参数而不是data。因此,您不必检查data.get('title')是否存在{}。Reference

class ParentSerializer(serializers.ModelSerializer):
    """
    Serializer for task
    """
    def validate_title(self, title):
        if not title:
            raise serializers.ValidationError('Please set title')
        return title

相关问题 更多 >