Получена ошибка AttributeError при попытке получить значение для поля `email` на сериализаторе `VerifyAccountSerializer`.
Я пытаюсь создать API verify, который генерирует случайный токен и сопоставляет его с пользователем
AttributeError at /api/verify/
Получили AttributeError при попытке получить значение для поля email
на сериализаторе VerifyAccountSerializer
.
Поле сериализатора может быть названо неверно и не совпадать с атрибутом или ключом экземпляра AllVerifyOrForgotToken
.
Оригинальный текст исключения был: 'AllVerifyOrForgotToken' object has no attribute 'email'.
models.py
class AllVerifyOrForgotToken(models.Model):
user = models.ForeignKey(
User,
verbose_name='User',
on_delete=models.CASCADE
)
token = models.CharField(max_length=32, unique=True)
def __str__(self):
return str(self.token)
serializers.py
class VerifyAccountSerializer(serializers.ModelSerializer):
email = serializers.EmailField()
class Meta:
model = AllVerifyOrForgotToken
fields = ('email',)
def create(self, validated_data):
email = validated_data.pop('email')
return AllVerifyOrForgotToken.objects.create(**validated_data)
viewsets.py
class VerifyViewset(mixins.CreateModelMixin, viewsets.GenericViewSet):
permission_classes = (AllowAny,)
queryset = AllVerifyOrForgotToken.objects.all()
serializer_class = VerifyAccountSerializer
def perform_create(self, serializer):
email = serializer.validated_data['email']
try:
user = User.objects.get(email=email)
serializer.save(
token=token_generator(32), #function to generate random string
user=user,
)
except User.DoesNotExist:
raise APIException(detail='User does not exist')
В VerifyAccountSerializer добавьте поле email в extra_fields, а не в fields. Например, так:
extra_fields = ('email',)
Поскольку вы отправляете определенное письмо, вам нужно отправить и ответ
class VerifyViewset(mixins.CreateModelMixin, viewsets.GenericViewSet):
permission_classes = (AllowAny,)
queryset = AllVerifyOrForgotToken.objects.all()
serializer_class = VerifyAccountSerializer
def perform_create(self, serializer):
email = serializer.validated_data['email']
try:
user = User.objects.get(email=email)
serializer.save(
token=token_generator(32), #function to generate random string
user=user,
)
except User.DoesNotExist:
raise APIException(detail='User does not exist')
return Response(serializer.data, status=status.HTTP_200_OK)