Получение "AuthToken.user" должно быть экземпляром "User". в django-rest-knox

Я создаю метод входа в систему с помощью Django-rest-Knox. Я создал пользовательского пользователя в приложении, используя AbstractBaseUser.

Это мой views.py

class LoginView(GenericAPIView):
    serializer_class = LoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)  # Load request body to serializer
        serializer.is_valid(raise_exception=True)  # Validate data in serializer and raise an error if one is found

        user = serializer.validated_data  # Get the validated data from the serializer
        token = AuthToken.objects.create(user)[1]  # Create an Authentication Token for the user

        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,  # Get serialized User data
            "token": token
        })

Serializer.py

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    # class Meta:
    #     model = User
    #     fields = ('username', 'password')
    def Validate(self, data):
        user = authenticate(**data)
        if user:
            return user
        raise serializers.ValidationError("Incorrect Credentials")

Это моя пользовательская модель пользователя

class User(AbstractBaseUser):
    _id = models.AutoField
    email = models.EmailField(verbose_name='email', max_length=255, unique=True)
    username = models.CharField(verbose_name='username', max_length = 100, unique=True)
    name = models.CharField(max_length = 100)
    date_joined = models.DateTimeField(verbose_name="date-joined", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last-login", auto_now=True)
    category = models.CharField(max_length=50, default= "teacher")
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_teacher = models.BooleanField(default=False)
    is_parent = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email',]

    objects = UserManager()
    
    def __str__(self):
        # return self.email
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

Я получаю ошибку Value при вводе логина как Cannot assign "OrderedDict([('username', 'api_test'), ('password', 'test@123')])": "AuthToken.user" must be a "User" instance.

Мне кажется, что где-то Django/Knox не может получить user и user.is_active в моем LoginSerializer. Я инициировал свою модель пользователя из начальных миграций.

Любая помощь в решении этой проблемы была бы замечательной. Спасибо.

В этой части вашего кода :

 return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,  # Get serialized User data
        "token": token
    })

Необходимо заменить токен на экземпляр пользователя, которому принадлежит этот токен, например :

 return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,  # Get serialized User data
            "token": User.objects.get(token=token)
        })
Вернуться на верх