同一验证器适用于不同领域

时间:2019-02-27 14:03:47

标签: python django-rest-framework

这就是这种情况:

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

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()

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在此处将“ FatherSerializer”用于“姐妹”字段

sister = FatherSerializer()

答案 1 :(得分:1)

您可以使用自定义验证声明自己的SiblingField,然后在FatherSerializer的{​​{1}}和brother的{​​{1}}上都使用它。

ChildSerializer