Эмпирическое правило не имеет значения, какая логика вашего бизнеса c, всегда используйте одну модель пользователя для вашего приложения . если вам нужно несколько типов пользователей, вы можете использовать атрибуты для определения типов пользователей. Например, в моем приложении я хочу три типа пользователей, Admin
, Broker
и Client
. Вот как мы можем это сделать.
class UserManager(BaseUserManager):
def create_client(self, username, first_name, last_name, email, phone, password=None):
user = self.model(
username=username,
first_name=first_name,
last_name=last_name,
phone=phone,
email=self.normalize_email(email)
)
user.set_password(password)
user.is_client = True
user.save(using=self.db)
return user
def create_reseller(self, username, first_name, last_name, email, phone, password=None):
user = self.create_client(username, first_name, last_name, email, phone, password)
user.is_reseller = True
user.save()
return user
def create_admin(self, username, first_name, last_name, email, phone, password=None):
user = self.create_reseller(username, first_name, last_name, email, phone, password)
user.is_admin = True
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
is_superuser = None
REQUIRED_FIELDS = ["username", "first_name", "last_name", "phone"]
EMAIL_FIELD = "email"
USERNAME_FIELD = 'email'
objects = UserManager()
email = models.EmailField(unique=True)
username = models.CharField(max_length=DefaultModel.MAX_LENGTH)
first_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
last_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
phone = PhoneNumberField(unique=True)
is_admin = models.BooleanField(default=False)
is_reseller = models.BooleanField(default=False)
is_client = models.BooleanField(default=False)
# storing timestamps for users.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
added_by = models.ForeignKey("self", models.CASCADE, default=None, null=True)
Итак, что я сделал, я использую пользовательский класс UserManager
, который отвечает за генерацию User
объектов модели, и я реализовал методы для генерации для все типы пользователей Client
, Broker
и Admin
.
DefaultModel
фактически являются классами, которые я использую в качестве констант для установки значений по умолчанию для моделей. Вот как это выглядит:
class DefaultModel:
MAX_LENGTH = 1000
MYSQL_UNIQUE_LENGTH = 255
Если вы не знаете о objects
в моделях, вы можете узнать об этом из Django документов. Пользовательские пользовательские модели Django Менеджеры