我正在使用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原则的明显解决方案并在串行器中手动重复其文本)?
答案 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__()
密钥。