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()