Django REST framework - AttributeError: объект 'ResetPasswordRequestSerializer' не имеет атрибута 'id'?

Я пытаюсь установить RequestPasswordResetAPI конечную точку.

# Serializer
class ResetPasswordRequestSerializer(serializers.Serializer):
    email = serializers.EmailField(min_length=2)

    class Meta:
        fields = ['email']

    def validate(self, data):
        print(data)
        # Check if email exists
        if data.get('email', ''):
            try:
                # Get the user
                user = User.objects.get(email=data.get('email', ''))
                print(f"User from validate {user}")
                return user
            except:
                print('exception')
                raise serializers.ValidationError("Email is not registered")
        raise serializers.ValidationError("Email is not registered")

api.py

class ResetPasswordRequesAPI(generics.GenericAPIView):
    serializer_class = ResetPasswordRequestSerializer

    def post(self, request, *args, **kwargs):
        print('make request')
        serializer = self.get_serializer(data=request.data)
        print('first line done')
        serializer.is_valid(raise_exception=True)
        # user = serializer.save()
        user = serializer.validated_data
        print(user)
        user = ResetPasswordRequestSerializer(
            user, context=self.get_serializer_context())
        print(f"user is {user}")
        uidb64 = urlsafe_base64_encode(user.id)
        token = PasswordResetTokenGenerator().make_token(user)
        print(f"second user is {user}")
        print(token)

После uidb64 = urlsafe_base64_encode(user.id) я получаю:

AttributeError: объект 'ResetPasswordRequestSerializer' не имеет атрибута 'id'

Когда я смотрю на вывод различных print(user) утверждений, которые я добавил повсюду:

user:

ResetPasswordRequestSerializer(<User: john>, context={'request': <rest_framework.request.Request: POST '/api/auth/reset_password/'>, 'format': None, 'view': <accounts.api.ResetPasswordRequesAPI object>})

.

Пытаюсь понять почему:

# In serializer
user = User.objects.get(email=data.get('email', ''))

Выдает только User без id и других полей. Когда я пытаюсь сгенерировать токен для сброса, я получаю больше ошибок AttributeErrors.

Проблема заключается в том, что вы еще не сохранили модель пользователя на момент валидации данных.

Метод сериализатора заключается в том, чтобы сначала проверить входные данные, а затем сохранить их. Например:

# first process request data into serializer
serializer = self.get_serializer(data=request.data)

# then validate data
serializer.is_valid(raise_exception=True)

# and save model, which creates an ID
user = serializer.save()

print(f'Model save, id is: {user.id}')

Посмотрите это учебное пособие по RestFramework, которое показывает, как все это хорошо работает вместе, if serializer.is_valid(): serializer.save()

Вернуться на верх