Дизайн класса 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']
# …
Как сказано в документации:
Список имен полей, которые будут запрашиваться при создании пользователя с помощью команды
createsuperuser
management. Пользователю будет предложено ввести значение для каждого из этих полей. Оно должно включать любое поле, для которого значение blank равноFalse
или не определено, и может включать дополнительные поля, которые вы хотите запросить при создании пользователя в интерактивном режиме.REQUIRED_FIELDS
не имеет никакого эффекта в других частях Django, например, при создании пользователя в админке.