Как изменить обязательные поля конечных точек DRF

Я использую jwt.io в своем DRF проекте. Как вы знаете, в jwt.io уже есть представление Login API под названием 'TokenObtainPairView', и оно требует 2 поля: имя пользователя и пароль. Но в нашем проекте мы хотим, чтобы пользователи входили в систему, используя свой email вместо имени пользователя. Я решаю эту задачу с помощью следующего кода:

class LoginAPIView(TokenObtainPairView):

def post(self, request, *args, **kwargs):
    email=request.data['email']
    request.POST._mutable = True
    profile=ProfileModel.objects.get(email=email)
    request.data['username']=profile.username
    request.POST._mutable = False
    return super().post(request, *args, **kwargs)

Это работает, но на моем swagger, когда разработчики front-end проверяют конечную точку, они видят, что конечная точка требует 2 поля: имя пользователя и пароль. Но я хочу, чтобы они видели обязательные поля, такие как email и пароль. Вот как выглядит моя конечная точка

Есть ли способ изменить его обязательные поля?

Думаю, если вам не нужно имя пользователя, вы можете определить свою собственную модель пользователя следующим образом.

Поле USERNAME_FIELD = 'email' в модели пользователя говорит Django, что нужно использовать email в качестве имени пользователя.

Не забудьте изменить settings.py для использования вашей собственной модели пользователя, добавив эту const: AUTH_USER_MODEL = 'users.User', где users - имя приложения, а User - имя модели.

from django.contrib.auth.models import (
    AbstractBaseUser,
    BaseUserManager,
    PermissionsMixin
)


class UserManager(BaseUserManager):

    def create_user(self, email, password=None, **extra_fields):
    """Creates and saves a new user"""
        if not email:
            raise ValueError('Users must have an email address')
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, password):
        if not email:
            raise ValueError('Users must have an email address')
        if not password:
            raise ValueError('Users must have a password')

        """Creates and saves a new super user"""
        user = self.create_user(email, password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

        return user

class User(AbstractBaseUser, PermissionsMixin):
"""Custom user model that suppors using email instead of username"""

    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    objects = UserManager()

    USERNAME_FIELD = 'email'

По умолчанию TokenObtainPairSerializer использует поле имени пользователя по умолчанию, определенное моделью, но если вам нужно изменить поведение без изменения модели, вы можете переопределить сериализатор токенов для использования предпочитаемого поля, т.е.:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer


class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    username_field = 'email'


class LoginAPIView(TokenObtainPairView):
    _serializer_class = CustomTokenObtainPairSerializer
Вернуться на верх