Переопределить определенный аргумент во всех запросах к модели 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, как подробно описано здесь в документации