Как дважды проверить пароль в сериализаторе django restframework? - PullRequest
0 голосов
/ 14 июля 2020

Я хочу дважды проверить password и repeated_password, отправленные из внешнего интерфейса.

{"user_data":{"user_name":"jim", "email":"jim@google.com", "password":"ddd","repeat_password":"ssss","role_list":[1,2,3]}}

И я добавляю валидатор в свой serilazer как:


# serilazers.py

class SUser(serializers.ModelSerializer):

    name = serializers.SerializerMethodField(read_only=True)
    repeat_password = serializers.CharField(read_only=True)
    role_list = serializers.SerializerMethodField(read_only=True)

    def get_name(self, obj):
        return obj.user_name

    def get_role_list(self, obj):
        role_queryset = MRole.objects.filter(group__in=obj.groups.all())
        return [
            {
                "role_id": role.id,
                "role_name": role.name,
            }
            for role in role_queryset
        ]

    def validate(self, attrs):
        print(attrs)
        # OrderedDict([('user_name', 'jim'), ('email', 'jim@163.com'), ('password', 'ddd')]) there's only password here , 
        # why repeat_password not appear?

        if value.get('password') == value.get('repeat_password'):
            return value
        raise exceptions.ValidationError('need same passwd')



    class Meta:
        model = MUser
        fields = ['id', 'name', 'user_name',
                  'email', 'password', 'repeat_password',
                  'groups', 'is_active',
                  'role_list']


# models.py

class Muser(AbstractUser):
    user_name = models.CharField(max_length=150,unique=False)
    email = models.EmailField(unique=True, blank=True)

    class Meta:
        db_table = 'User'
        verbose_name_plural = verbose_name = 'user'


в проверить данные

user_data = request.data.get("user_data")
serializer_for_user = SUser(data={
                    **user_data
                })
serializer_for_user.is_valid(raise_exception=True)

Но когда я пытаюсь проверить данные, я не могу получить repeat_password в моем методе проверки serilazer.

Как я могу выполнить двойную проверку pwd?

Спасибо.

1 Ответ

1 голос
/ 14 июля 2020

попробуйте удалить read_only=True

repeat_password = serializers.CharField()

В вашем случае, я думаю, вам следует go для Serializer, а не ModelSerializer, потому что переключение значения read_only всегда будет давать вам ошибки .

  • Если вы попробуете с read_only=True, то поле будет проигнорировано.
  • Если вы попробуете с read_only=False, то оно попытается сохранить это в вашей базе данных и будет выдает ошибку, что этого поля нет в базе данных.

Поля только для чтения включаются в выходные данные API, но не должны включаться во входные данные во время операций создания или обновления. Любые поля read_only, которые неправильно включены во вход сериализатора, будут проигнорированы.

Установите значение True, чтобы гарантировать, что поле используется при сериализации представления, но не используется при создании или обновлении экземпляра во время десериализации.

https://www.django-rest-framework.org/api-guide/fields/#read_only

...