Дизайн класса 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, например, при создании пользователя в админке.

Вернуться на верх