我正在使用django构建学生注册系统,在该系统中注册了学生。根据对象级别的权限,班级老师和校长只能查看学生。有School
,Class
和Student
模型。每所学校可以有一位以上的校长,每班可以有一位以上的班主任。
将有两个对象级别的权限:
我搜索了各种第三方django库,以实现这种分层的用户组体系结构。我见过django-groups-manager,但对于我的问题来说有点复杂。然后,我决定使用django-mptt的registration of existing models功能,并提出模型实现,例如:
from django.contrib.auth.models import Group
from django.db import models
import mptt
from mptt.fields import TreeForeignKey
TreeForeignKey(Group, on_delete=models.CASCADE, blank=True,
null=True).contribute_to_class(Group, 'parent')
mptt.register(Group, order_insertion_by=['name'])
class School(models.Model):
"""School object"""
name = models.CharField(max_length=255)
group = models.ForeignKey(
Group, related_name='school', on_delete=models.CASCADE)
class Class(models.Model):
"""Class object"""
name = models.CharField(max_length=255)
group = models.ForeignKey(
Group, related_name='class', on_delete=models.CASCADE)
school = models.ForeignKey(
School,
on_delete=models.CASCADE
)
class Student(models.Model):
"""Person object"""
fullname = models.CharField(max_length=255)
class = models.ForeignKey(
Class,
on_delete=models.CASCADE
)
通过这种方式,每个School
和Class
对象将具有自己的Group
,学校组是该特定学校的班级组的父级。因此,我现在可以使用Django的User
创建学校的校长用户,并将其分配给相关的家长组。同样,我还可以创建教师用户,并将其分配给班级对象的子级组。当学校的校长或班主任想要查看其注册学生时,我可以通过过滤其用户组来应用对象级别权限。
我的问题是,这是正确的方法吗?每个学校/班级对象创建一个小组有意义吗?
答案 0 :(得分:0)
由于nigel222的建议,我没有使用内置的Django User
模型,而是使用了内置的Django组。我还遵循了this教程,这确实很有帮助。我最新的models.py
版本如下(不要忘记覆盖默认的User
类,您需要通过将AUTH_USER_MODEL = 'myapp.User'
添加到settings.py
文件中来让django知道它。 ):
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""Custom user model with an extra type field"""
USER_TYPE_CHOICES = (
(1, 'superuser'),
(2, 'principaluser'),
(3, 'teacheruser'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
class School(models.Model):
"""School object"""
name = models.CharField(max_length=255)
users = models.ManyToManyField(settings.AUTH_USER_MODEL)
class Class(models.Model):
"""Class object"""
name = models.CharField(max_length=255)
users = models.ManyToManyField(settings.AUTH_USER_MODEL)
school = models.ForeignKey(
School,
on_delete=models.CASCADE
)
class Student(models.Model):
"""Person object"""
fullname = models.CharField(max_length=255)
class = models.ForeignKey(
Class,
on_delete=models.CASCADE
)