Django rest框架忽略了在模型上设置的error_messages

时间:2015-09-06 09:45:43

标签: django python-3.x django-rest-framework

我正在使用DRF 3.2.3并遇到此问题。我有这个用于创建用户的序列化程序(Web应用程序使用自定义用户模型):

class CreateGRUserSerializer(serializers.ModelSerializer):
    confirm_password = serializers.CharField(max_length=128, allow_blank=False, 
            write_only=True, style={'input_type': 'password'})

    def validate(self, data):
        if data['password'] != data['confirm_password']:
            raise serializers.ValidationError({'password': "Passwords do not match", 'confirm_password': "Passwords do not match"})
        return data

    class Meta:
        model = GRUser
        fields = ('username', 'email', 'password', 'confirm_password')
        extra_kwargs = {'password': {'write_only': True, 'style': {'input_type': 'password'}}}

    def create(self, validated_data):
        user = GRUser(
            email=validated_data['email'],
            username=validated_data['username']
        )
        user.set_password(validated_data['password'])
        user.init_activation(False)
        user.save()
        return user

问题是,完全忽略模型中指定的错误消息。例如,电子邮件字段在GRUser模型中定义如下:

email = models.EmailField(_('email address'), unique=True,
    help_text=_('Email address that acts as the primary unique identifier for the user.'),
    error_messages={
        'unique': _("A user with that email already exists."),
    })

当使用可浏览的api时,DRF甚至设法从模型中获取并显示帮助文本,但是,当我输入已使用的电子邮件而不是"A user with that email already exists"时,我得到DRF的默认值{{ 1}}消息。

是否存在设计原因?我可以以某种方式使DRF使用模型中的错误消息(除了违反DRY原则的明显解决方案并在串行器中手动重复其文本)?

1 个答案:

答案 0 :(得分:1)

您可能必须覆盖UniqueValidator已用于唯一字段的ModelSerializer。默认验证程序不使用来自模型的消息,截至目前。这就是你要做的事情:

class CreateGRUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(validators=[
            UniqueValidator(
                queryset=GRUser.objects.all(),
                message="A user with that email already exists.",
            )]
        )

或者,您可以在序列化程序的'unique'方法中更新'error_messages' fields['email']属性的__init__()密钥。