Я давно пользуюсь Django, но до сих пор никогда не думал об этом.
В настоящее время у меня есть проект, который содержит разные уровни пользователя. Обычно, в моем прошлом опыте, я только разрабатывал системы, использующие Django только с двумя пользовательскими уровнями: суперпользовательский и обычный / обычный пользователь. Итак, мой вопрос Каковы эффективные способы представления этих различных уровней пользователей в модели / базе данных? Здесь я собираюсь использовать школьную систему в качестве примера, а также изложу некоторые из моих начальных мыслей о
Уровни пользователя:
- Администратор (администратор и персонал)
- Директор
- Учитель
- Ученики
Метод № 1: добавление новых таблиц на основе каждого уровня пользователя
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
user = models.CharfieldField(max_length = 10, unique = True)
class Admin(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
class Pricipal(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
Метод № 2: добавление дополнительных атрибутов пользовательских типов в модель пользователя
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
user = models.CharfieldField(max_length = 10, unique = True)
is_superuser = models.BooleanField(default = False)
is_staff = models.BooleanField(default = False)
is_principal = models.BooleanField(default = False)
is_teacher = models.BooleanField(default = False)
is_student = models.BooleanField(default = False
'''
User table in DB:
user | is_superuser | is_staff | is_principal | is_teacher | is_student
'''
Мои мысли:
В методе № 1, поскольку встроенная модель User имеет два поля, is_staff и is_superuser, возможно ли реализовать / изменить поля в таблице SuperUser / Admin, как в примере выше? Это означает, что когда я создаю администратора / суперпользователя, я хочу, чтобы он добавил новую строку в таблицу администраторов вместо добавления нового пользователя и обновления пользовательских полей is_superuser и is_staff до 1 во встроенной модели User.
В методе № 2 проблема заключается в том, что таблицы с разными правами доступа напрямую связаны с ним. Например, модель «Зарплата» (к которой пользователь Студента не может получить доступ) имеет прямую связь с моделью «Пользователь» (содержит пользователя «Студент»).
Я надеюсь, что мне удастся получить некоторые идеи, а также правильный эффективный способ реализовать это так, чтобы предотвратить любые неудобства реализации и ошибки в будущем. Большое спасибо.