Django: реализация нескольких уровней/ролей/типов пользователейPython

Программы на Python
Anonymous
Django: реализация нескольких уровней/ролей/типов пользователей

Сообщение Anonymous »

Я использую 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, поскольку встроенная модель пользователя имеет два поля, is_staff и is_superuser. Можно ли реализовать/изменить поля в таблице SuperUser/Admin, как в примере выше? Это означает, что когда я создаю администратора/суперпользователя, я хочу, чтобы он добавлял новую строку в таблицу администраторов вместо добавления нового пользователя и обновления полей is_superuser и is_staff пользователя до 1 во встроенной модели пользователя.

В методе №2 проблема в том, что к нему напрямую подключаются таблицы с разными правами доступа. Например, модель «Зарплата» (к которой пользователь «Студент» не имеет доступа) имеет прямую связь с моделью «Пользователь» (содержит пользователя «Студент»).

Я надеюсь, что смогу получить некоторые идеи, а также правильный эффективный способ реализации этого, чтобы предотвратить любые неудобства и ошибки реализации в будущем. Спасибо большое.

Подробнее здесь: https://stackoverflow.com/questions/610 ... oles-types

Вернуться в «Python»