Я начинаю свой веб-проект с использованием Django и Django Rest Framework. Я хотел, чтобы в моем поле имени пользователя не учитывался регистр, и поэтому я искал в Интернете информацию о том, как этого добиться, и попал в этот прекрасный блог: https://simpleisbetterthancomplex.com/tutorial/2017/02/06/how-to-implement-case-insensitive-username.html. Он предложил этот метод:
from django.contrib.auth.models import AbstractUser, UserManager
class CustomUserManager(UserManager):
def get_by_natural_key(self, username):
case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
return self.get(**{case_insensitive_username_field: username})
class CustomUser(AbstractUser):
objects = CustomUserManager()
для models.py
Но когда я писал тесты, они терпели неудачу, потому что User.objects.get_by_natural_key возвращал два пользовательских объекта, когда я создал двух пользователей с одинаковым именем пользователя, но с разным регистром (например, «aniket» и «Aniket»).
Итак, я прошел через этот подход:
from django.contrib.auth.models import UserManager, AbstractUser
# Create your models here.
class CustomUserManager(UserManager):
def create_user(self, username, email=None, password=None, **extra_fields):
return super().create_user(username.lower(),email,password,**extra_fields)
def create_superuser(self, username, email, password, **extra_fields):
return super().create_superuser(username.lower(),email,password,**extra_fields)
def get_by_natural_key(self, username):
case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
return self.get(**{case_insensitive_username_field: username})
class User(AbstractUser):
objects = CustomUserManager()
Итак, этот подход на должном уровне?