我已经使用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 表?这意味着当我创建管理员 / 超级用户时,我希望它将新行添加到 Admin 表中,而不是在内置的用户模型中创建新用户并更新用户的 is_superuser 和 is_staff 字段为 1。
在方法 #2 中,它的问题在于拥有不同访问权限的表与其直接连接。例如,薪资模型(无法被学生用户访问)与用户模型(包含学生用户)直接链接。
我希望能够得到一些见解,并了解一种适当有效的实现方式,以避免将来的任何实现不便和错误。非常感谢。