Получена ошибка 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)
Вернуться на верх