Django запрос на обновление PATCH с использованием метода set_password - PullRequest
0 голосов
/ 03 мая 2020

У меня есть настройки ниже,

view.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = apis_models.User.objects.all().order_by('-date_joined')
    serializer_class = apis_serializers.UserSerializer
    permission_classes = [HasPermPage]
    http_method_names = ['get', 'patch']

Serializer.py

class UserSerializer(CustomSerializer):
    group = GroupSerializer(read_only=True)

    class Meta:
        model = apis_models.User
        fields = '__all__'

models.py

class User(DFModel, AbstractBaseUser):
    GENDER_CHOICES = [
        ('m', 'Male'),
        ('f', 'Female'),
        ('n', 'Not sure'),
    ]

    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255, null=True)
    company = models.CharField(max_length=255, null=True)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True)
    date_of_birthday = models.DateField(null=True)
    job_title = models.CharField(max_length=255, null=True)
    description = models.TextField(null=True)
    credit_card = models.CharField(max_length=255, null=True)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    group = models.ForeignKey('Group', on_delete=models.PROTECT, null=True)

Использование REST API Я выполняю запрос PATCH для модели User и пытаюсь обновить пароль. Пароль хранится в виде простого текста. Я обнаружил, что метод set_password хранит его в зашифрованном виде. Может кто-нибудь, пожалуйста, помогите мне реализовать это. Я не уверен, где включить этот метод. В viewset или сериализаторе? И как? Любая помощь будет оценена.

1 Ответ

1 голос
/ 03 мая 2020

Переопределите ваш update(...) метод (и create метод) Serializer as,

class UserSerializer(CustomSerializer):
    group = GroupSerializer(read_only=True)

    class Meta:
        model = apis_models.User
        fields = '__all__'

    <b>def create(self, validated_data):
        user = super().create(validated_data)

        try:
            user.set_password(validated_data['password'])
            user.save()
        except KeyError:
            pass

        return user

    def update(self, instance, validated_data):
        user = super().update(instance, validated_data)

        try:
            user.set_password(validated_data['password'])
            user.save()
        except KeyError:
            pass

        return user</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...