Как 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
Вернуться на верх