Дизайн пользовательского класса в Django

Я использую класс AbstractUser для расширения своего класса User. В моем классе пользователей сейчас есть 3 роли: администратор, преподаватель и выпускник. Я могу использовать is_superuser, is_staff для решения проблемы, однако в будущем может появиться больше ролей, и если я воспользуюсь вышеуказанным методом, добавить больше ролей лучше будет невозможно. Но если я использую дополнительное поле role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI), все выглядит нормально. Но при использовании superuser, is_superuser = True и роль пользователя — Выпускник. Кстати, я работаю над проектом, использующим django, rest_framework. Я хочу, чтобы Пользователей с ролью Лектора создавал Администратор и устанавливал пароль по умолчанию, и через 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}'

Непонятно, в чем ваша проблема. Что вы имеете в виду под «Но при использовании суперпользователя is_superuser = True и роль пользователя — Выпускник»?

dmitri 29.04.2024 05:55

Когда я создаю суперпользователя с помощью python manage.py createsuperuser, мне не разрешено выбирать роль, поэтому значением роли суперпользователя по умолчанию теперь будет «Выпускник».

Trần Lê Lân 29.04.2024 06:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте role в REQUIRED_FIELDS [Django-doc]:

class User(AbstractUser):
    REQUIRED_FIELDS = ['role']
    # …

Как сказано в документации:

Список имен полей, которые будут запрашиваться при создании пользователя с помощью команды управления createsuperuser. Пользователю будет предложено ввести значение для каждого из этих полей. Он должен включать любое поле, для которого пусто False или неопределенное, и может включать дополнительные поля, которые вы хотите запрашивать при интерактивном создании пользователя. REQUIRED_FIELDS не имеет эффекта в других частях Django, например, при создании пользователя в администраторе.

Суперпользователь, вероятно, должен иметь роль администратора, возможно, проще просто переопределить метод create_superuser и жестко запрограммировать его там.

Abdul Aziz Barkat 29.04.2024 10:25

Другие вопросы по теме