DRF Простые функции JWT RefreshToken.for_user(user) получают ошибку атрибута с пользовательской моделью пользователя

Я создаю пользовательскую модель пользователя, в которой usercode является PrimaryKey

class User(AbstractBaseUser, PermissionsMixin):
        usercode = models.CharField(primary_key=True, unique=True, null=False)
    username = models.CharField(max_length=255, unique=True, null=True, blank=True, default=None)
    email = models.EmailField(unique=True, null=True, blank=True, default=None)
    phone_number = models.CharField(max_length=128, unique=False, null=True, blank=True, default=None)
    password = models.CharField(max_length=256, null=False)
        ...

Я заменил стандартный сериализатор TokenObtainPairView из SimpleJWT на и работает вполне хорошо

class CustomTokenObtainPairSerializer(serializers.Serializer):
    usercode = serializers.CharField(max_length=64)
    password = serializers.CharField(max_length=255)

    def validate(self, attrs):
        usercode = attrs['usercode'].upper()
        password = attrs['password']

        # Get user object for validating
        user = User.objects.filter(usercode=usercode).first()
        # Validating login request
        if user is None:
            raise AuthenticationFailed(f'User not found!')
        if not check_password(password, user.password):
            return Response({'message': 'Wrong password!'})
        user_data = UserSerializer(user).data
        tokens = get_tokens_for_user(user)

        return {'user': user_data, 'tokens': tokens}

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer


def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)

    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

Но когда я пытаюсь получить пользовательский токен, как в источнике Creating tokens manually. я получаю ошибку RefreshToken.for_user(user) Подробности ошибки:

AttributeError at /application/api/v1/2024/token/
'User' object has no attribute 'id'
Request Method: POST
Request URL:    http://127.0.0.1:8000/application/api/v1/2024/token/
Django Version: 5.0.3
Exception Type: AttributeError
Exception Value: 'User' object has no attribute 'id'

Я проверил и получил, что для RefreshToken.for_user требуется модель User с id, равным PrimaryKey

File "D:\development\py\DJ_Project\venv\Lib\site-packages\rest_framework_simplejwt\tokens.py", line 203, in for_user
    user_id = getattr(user, api_settings.USER_ID_FIELD)

Я ищу решение, как заменить 'id' на 'usercode' или другой пользовательский первичный ключ, не используя стандартный 'id'. Кто-нибудь может помочь.

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