2017-06-28 11 views
2

と更新項目が、私はシリアライザクラスを持っているときにエラーをスロー:Djangoの残りのフレームワークUniqueValidator古いデータ

class AdministratorCreateUpdateSerializer(ModelSerializer): 

    class Meta: 
     model = Administrator 
     fields = [ 
      'username', 
      'email', 
      'password', 
      'first_name', 
      'last_name', 
     ] 
    username = serializers.CharField(
     source='user.username', 
     validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    email = serializers.EmailField(
     source='user.email', 
     validators=[UniqueValidator(queryset=User.objects.all())] 
    ) 
    password = serializers.CharField(
     source='user.password', 
     allow_blank=True, 
     style={'input_type': 'password'} 
    ) 
    first_name = serializers.CharField(
     source='user.first_name' 
    ) 
    last_name = serializers.CharField(
     source='user.last_name' 
    ) 

私は新しい管理者、ほかのユーザー名と電子メールの仕事のバリデータを作成する場合。

しかし、私はデータを更新します。私は古いデータを単純に書き込んで保存するだけですが、バリデーターはユーザー名と電子メールが一意でなければならないと言います。

このバリデーターを変更するには、古い値と同じではない新しい値で更新する場合のみ実行しますか?

答えて

0

私は前に同じ問題がありました。私は、シリアライザにupdate()メソッドをオーバーライドし、Djangoのクエリセットのためexclude()メソッドを使用して、それを修正:他のユーザーが自分のユーザー名を更新しようとした場合

def update(self, instance, validated_data): 
    username = validated_data.get('username', '') 

    if User.objects.exclude(pk=instance.pk).filter(username=username): 
     raise serializers.ValidationError('User with this username already exists.') 

    instance.__dict__.update(**validated_data) 
    instance.save() 

    return instance 

は、今では唯一のエラーを発生させ、それはあなたと同じです。これが役立つ

希望:)

UPDATEは:

あなたはvalidate_<property>()メソッドをオーバーライドすることができます。あなたの場合:

def validate_username(self, value): 
    # self.instance is the current instance (Administrator) 
    # this method is called on every request, so you should do 
    # if self.instance 
    # to check if the method is update/post, so you can have an instance 
    # and then you do the check for the username uniqueness 
    if self.instance and User.objects.exclude(pk=self.instance.pk).filter(username=value): 
     raise serializers.ValidationError('User with this username already exists.') 

    return value 
関連する問題