Как Django rest fremakework проверяет вторичный пароль?
Я не использую auth, я добавил поле re_password в мой сериализатор, я думаю, что он выполняет проверку согласованности с полем password, когда приходит запрос POST
Но проблема в том, что если re_password и password являются write_only, то PUT и PATCH запросы также должны передавать эти 2 поля.
Я полагаю, что проверка согласованности re_password и password является разумной для регистрации пользователя, но она не так необходима для обновления информации о пользователе.
Что я могу сделать, чтобы re_password и password требовались только для запросов POST?
- POST: мне нужно
passwordиre_passwordполе регистрации нового аккаунта пользователя - PUT/PATCH: мне не нужны
passwordиre_password, так как они не подходят для обновления информации о пользователе
class UserSerializer(serializers.ModelSerializer):
re_password = serializers.CharField(write_only=True, min_length=6, max_length=20, error_messages={
"min_length": "Password at least 6 digits",
"max_length": "Password up to 20 characters",
})
class Meta:
exclude = ("is_delete",)
model = models.User
extra_kwargs = {**CommonSerializer.extra_kwargs, **{
"password": {
"write_only": True,
"min_length": 6,
"max_length": 20,
"error_messages": {
"min_length": "Password at least 6 digits",
"max_length": "Password up to 20 characters",
}
},
}}
def validate_password(self, data):
return hashlib.md5(data.encode("utf-8")).hexdigest()
def validate_re_password(self, data):
return hashlib.md5(data.encode("utf-8")).hexdigest()
def validate(self, validate_data):
if validate_data['password'] != validate_data.pop('re_password'):
raise exceptions.AuthenticationFailed("password not match")
return validate_data
def create(self, validate_data):
instance = models.User.objects.create(**validate_data)
return instance
def update(self, instance, validate_data):
password = validate_data.get("password")
validate_data["password"] = hashlib.md5(
password.encode("utf-8")).hexdigest()
for key, val in validate_data.items():
setattr(instance, key, val)
instance.save()
return instance