Дизайн класса User в Django
Я использую класс AbstractUser для расширения моего класса User. В моем классе User в настоящее время есть 3 роли: Администратор, Преподаватель и Выпускник. Я могу использовать is_superuser, is_staff для решения этой проблемы, однако в будущем может появиться больше ролей, и если я буду использовать вышеуказанный метод, то не смогу добавить больше ролей. Но если я использую дополнительное поле role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI), то все выглядит нормально. Но при использовании superuser, is_superuser = True и роли пользователя - Alumni.
Кстати, я работаю над проектом, используя django, rest_framework. Я хочу, чтобы пользователи с ролью Lecturer создавались администратором и задавали пароль по умолчанию, а через 24 часа с момента создания аккаунта, если лектор не сменит пароль, аккаунт будет заблокирован и администратору придется заново открывать его для лектора. Я написал две функции save и check_password_expiry, но не уверен, что они работают так, как я хочу.
Может ли кто-нибудь решить мою проблему, пожалуйста?
class User(AbstractUser):
class Role(models.IntegerChoices):
ADMIN = 1, "Admin"
LECTURER = 2, "Lecturer"
ALUMNI = 3, "Alumni"
avatar = CloudinaryField(null=True)
cover = CloudinaryField(null=True)
role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
alumni = models.OneToOneField(Alumni, on_delete=models.CASCADE, null=True, blank=True)
friends = models.ManyToManyField('self', symmetrical=True, blank=True)
def save(self, *args, **kwargs):
if self.role == User.Role.LECTURER and not self.password:
self.set_password('ou@123')
super().save()
def check_password_expiry(self):
if self.role == User.Role.LECTURER:
if timezone.now() - self.date_joined > timedelta(hours=24):
self.is_active = False
self.save()
def __str__(self):
return f'{self.last_name} {self.first_name}'
Добавьте role в REQUIRED_FIELDS [Django-doc]:
class User(AbstractUser):
REQUIRED_FIELDS = ['role']
# …
Как сказано в документации:
Список имен полей, которые будут запрашиваться при создании пользователя с помощью команды
createsuperusermanagement. Пользователю будет предложено ввести значение для каждого из этих полей. Оно должно включать любое поле, для которого значение blank равноFalseили не определено, и может включать дополнительные поля, которые вы хотите запросить при создании пользователя в интерактивном режиме.REQUIRED_FIELDSне имеет никакого эффекта в других частях Django, например, при создании пользователя в админке.