Переопределить определенный аргумент во всех запросах к модели django?

У меня есть пользовательская модель пользователя django, которая не содержит поля имени пользователя, вместо него используется email. Я пытаюсь реализовать сторонний пакет, который делает запросы к модели пользователя на основе username. Есть ли способ переопределить все запросы (get, filter и т.д.) к этой модели через пользовательский менеджер или иным образом, чтобы username просто преобразовывался в email?

Это будет выглядеть так:

User.objects.filter(username="grrrrrr@grrrrrr.com")

инто

User.objects.filter(email="grrrrrr@grrrrrr.com")

Вы можете создать подкласс QuerySet, в котором вы "очистите" входящие kwargs для методов get и filter и измените имя пользователя на email

class UserQuerySet(models.QuerySet):

    def _clean_kwargs(self, kwargs):
        if 'username' in kwargs:
            kwargs['email'] = kwargs['username']
            del kwargs['username']
        return kwargs

    def filter(self, *args, **kwargs):
        kwargs = self._clean_kwargs(kwargs)
        return super().filter(*args, **kwargs)

    def get(self, *args, **kwargs):
        kwargs = self._clean_kwargs(kwargs)
        return super().get(*args, **kwargs)


class UserManager(BaseUserManager):

    def get_queryset(self):
        return UserQuerySet(self.model, using=self._db)


class User(AbstractBaseUser):
    
    objects = UserManager()

Пользовательский менеджер должен будет реализовать create_user и create_superuser, как подробно описано здесь в документации

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