Django Rest Framework UniqueValidator在使用旧数据更新项时抛出错误

Django Rest Framework UniqueValidator在使用旧数据更新项时抛出错误,django,django-rest-framework,Django,Django Rest Framework,我有一个序列化程序类: class AdministratorCreateUpdateSerializer(ModelSerializer): class Meta: model = Administrator fields = [ 'username', 'email', 'password', 'first_name', 'last

我有一个序列化程序类:

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'
    )
当我创建新的管理员时,用户名和电子邮件的验证程序运行良好

但当我更新数据时。我只是简单地填写旧数据并保存,但验证器说用户名和电子邮件必须是唯一的


如何更改此验证器仅在使用不等于旧值的新值进行更新时执行?

我以前也遇到过同样的问题。我通过重写序列化程序上的
update()
方法,并对Django queryset使用
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
现在,它只会在其他用户尝试更新其用户名时引发错误,这与您的用户名相同

希望这会有所帮助:)

更新:

您可以重写
验证方法()。就你而言:

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