gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:02:47 27 4
gpt4 key购买 nike

我有一个序列化器类:

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() 来修复它序列化程序上的方法并使用 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

现在,如果任何其他用户尝试更新他的用户名,它只会引发错误,这与您的用户名相同。

希望这会有所帮助:)

更新:

您可以覆盖 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

关于使用旧数据更新项目时,Django Rest Framework UniqueValidator 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44794288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com