2017-06-28 37 views
2

的項目我有一個序列化器類:Django的REST框架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()方法和使用方法exclude()適用於Django的查詢集:

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