Как разрешить изменение поля модели, если пользователь имеет определенную роль?

У меня есть CustomUserModel в Django и четыре роли - пользователь, студент, куратор, администратор. И у меня есть поле group в CustomUserModel, которое по умолчанию имеет значение Null

Теперь каждый пользователь может иметь группу, но я хочу, чтобы она была только у студентов. Как я могу сделать это на уровне моей модели? (например, как проверить, что для изменения значения поля group с Null на другое необходимо иметь роль Student)

Я пытался использовать валидатор, но там я могу получить только значение группы, и не могу использовать self для проверки, например, если self.role = STUDENT

USER = 'user'
STUDENT = 'student'
CURATOR = 'curator'
ADMIN = 'admin'

ROLES = (
        (USER, USER),
        (STUDENT, STUDENT),
        (CURATOR, CURATOR),
        (ADMIN, ADMIN),
)

def validate_user_can_have_group(value):
    ###

class User(AbstractUser):
    role = models.CharField(max_length=max([len(role[0]) for role in ROLES]),
                            choices=ROLES,
                            default=USER,)

    group = models.ForeignKey('structure.Group',
                              on_delete=models.SET_NULL,
                              validators=[validate_user_can_have_group],
                              related_name='users',
                              blank=True,
                              null=True,)

    class Meta:
        swappable = "AUTH_USER_MODEL"
        ordering = ['username']

    @property
    def is_admin(self):
        return (
            self.role == ADMIN or self.is_staff
            or self.is_superuser
        )

    @property
    def is_curator(self):
        return self.role == CURATOR

    @property
    def is_student(self):
        return self.role == STUDENT

    @property
    def is_user(self):
        return self.role == USER

    def __str__(self):
        return self.username

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