2015-09-06 66 views
0

我正在使用DRF 3.2.3並遇到此問題。我有這樣的序列化程序被用於創建用戶(Web應用程序使用自定義的用戶模型):Django rest框架忽略設置在模型上的error_messages

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的默認"This field must be unique."消息。

是否有設計理由爲什麼會發生?我能以某種方式讓DRF使用來自模型的錯誤消息(除了違反DRY原則並在串行器中手動重複其文本的顯而易見的解決方案之外)?

回答

1

您可能必須覆蓋UniqueValidator,已用於唯一字段。截至目前,缺省驗證器不使用模型中的消息。這是你會怎麼做:

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

或者你可以更新fields['email']'error_messages'財產的串行器__init__()方法'unique'關鍵。