不同字段的同一验证器

2024-09-28 18:56:19 发布

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

情况就是这样:

我有两个序列化程序类,一个从另一个继承

class FatherSerializer(...):
    class Meta(object):
        model = Person
        fields = ('name', 'email', 'brother')

    name = serializers.CharField()
    email = serializers.EmailField()
    brother = serializers.CharField()

    def validate_email(self, value):
        if Person.objects.filter(email=value).exists():
            raise serializers.ValidationError('Such email already exists')
        return value

    def validate_brother(self, value):
        if not Person.objects.filter(name=value).exists():
            raise serializers.ValidationError('Such person doesnt exist')
        return Person.objects.get(name=value)

class ChildSerializer(FatherSerializer):
    class Meta(object):
        model = Person
        fields = ('name', 'email', 'sister')

    sister = serializers.CharField()

我想对“姐妹”使用与“兄弟”相同的验证器。它适用于电子邮件,因为字段的名称是相同的。但是,有没有一种方法可以使同一个序列化程序适用于两个不同的字段

我尝试了一个自定义验证器,在两个类之外实现它,并在字段的validators参数中使用它。但它不能正常工作,因为我希望返回的值是Person对象,但我得到的只是原始输入值(所以称为“name”)

先谢谢你


Tags: name程序序列化objectsobjectvalueemailexists
2条回答

您可以使用自定义验证声明自己的SiblingField,然后在FatherSerializer上为brother使用它,在ChildSerializer上为sister使用它

class SiblingField(serializers.CharField):
    <add your custom validation methods here>

class FatherSerializer(...):
    brother = SiblingField()

class ChildSerializer(FatherSerializer):
    sister = SiblingField()

您可以在“姐妹”字段中使用FatherSerializer

sister = FatherSerializer()

相关问题 更多 >