Разрешения авторизации Django для каждой модели

Я столкнулся с проблемой в Django с разрешениями авторизации (немного новичок в Django). У меня есть модели учителя, ученика и менеджера. Когда учитель посылает запрос к моему API, он должен получить другие разрешения, чем ученик (т.е. ученик будет видеть все свои оценки за тесты, в то время как учитель может видеть всех учеников своего класса, а менеджер может видеть все).

Мои вопросы следующие:

  1. Как сделать все мои модели действительными пользователями системы? Я пробовал добавлять
models.OneToOneField(User, on_delete=models.CASCADE)

Но для этого нужно создать пользователя, а затем назначить его учителю. Я хочу, чтобы реальный "экземпляр" учителя был используемым пользователем.

  1. Как мне проверить, к какому "типу" относится мой пользователь? Я должен просматривать все 3 таблицы каждый раз, когда пользователь отправляет запрос, и выяснять, к какому типу он относится? Это звучит неправильно. Я думал о создании глобальной таблицы 'user' со столбцом "type", но тогда я не смогу добавить специфические столбцы в мои модели (т.е. у студента должен быть средний балл, а у преподавателя - нет) .

Буду признателен за любые указания в нужном направлении.

Когда вам нужно несколько типов пользователей, например, в вашем случае необходимо несколько ролей, таких как студент, учитель, менеджер и т.д... тогда вам нужны разные роли для всех людей, чтобы распределить их по категориям. Чтобы иметь эти роли, вам нужно расширить AbstractUser (для простого случая) в вашей models.py для вашей User модели, как показано ниже:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
      STUDENT = 1
      TEACHER = 2
      MANAGER = 3
      
      ROLE_CHOICES = (
          (STUDENT, 'Student'),
          (TEACHER, 'Teacher'),
          (MANAGER, 'Manager'),
      )
      role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, null=True)
      # You can create Role model separately and add ManyToMany if user has more than one role
Вернуться на верх