在django-rest框架中更新用户时,电子邮件已经存在



我在更新用户时,遇到电子邮件已经存在。如何使用CCD_ 1来克服CCD_ 2或CCD_ 3问题。然后使用extra_kwargs中的CCD_ 4作为CCD_。。带回我的电子邮件字段验证。

但这似乎不是一个真正的解决方案。由于我们只是更新现有的模型对象。。为什么它的行为就像我们在创造一个新的。

我认为应该有定义updatepartial_update的东西,否则我不知道会发生什么是否有其他解决方案??

class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "id", "full_name", "gender", "phone", "email", "date_of_birth"
extra_kwargs = {
# "phone": {"validators": []},
# "email": {"validators": [EmailValidator]},
}

据我所知,默认情况下,User django中的email字段不是唯一的,如果想更改数据库中的唯一性,可以使用AbstractUser,它会自动在序列化程序中检测到唯一性,并且无法保存已存在电子邮件的用户。

然后假设我们没有使用AbstracUser,所以我们需要在序列化程序中手动验证唯一的电子邮件。我们可以使用两种方式:

1.UniqueValidator

class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "full_name", "gender", "phone", "email", "date_of_birth"]
extra_kwargs = {
"email": {
"validators": [
EmailValidator
UniqueValidator(
queryset=User.objects.all(),
message="This email already exist!"
)
]
},
}

2.手动验证电子邮件:在我们的序列化程序中,只需添加验证电子邮件的功能

def validate_email(self, value):
if User.objects.filter(email=value).exists():
raise serializers.ValidationError("This email already exists!.")
return value

CMIIW

最新更新