python django中的基本组层次结构

时间:2019-07-03 10:39:54

标签: python django python-3.x django-models hierarchical-data

我正在使用django构建学生注册系统,在该系统中注册了学生。根据对象级别的权限,班级老师和校长只能查看学生。有SchoolClassStudent模型。每所学校可以有一位以上的校长,每班可以有一位以上的班主任。

将有两个对象级别的权限:

  1. 校长将能够看到所有注册到学校的学生。他们将无法看到其他学校的学生。
  2. 班主任将能够看到已注册班级的学生。他们将无法看到注册到相同或不同学校其他班级的学生。

我搜索了各种第三方django库,以实现这种分层的用户组体系结构。我见过django-groups-manager,但对于我的问题来说有点复杂。然后,我决定使用django-mpttregistration 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
    )

通过这种方式,每个SchoolClass对象将具有自己的Group,学校组是该特定学校的班级组的父级。因此,我现在可以使用Django的User创建学校的校长用户,并将其分配给相关的家长组。同样,我还可以创建教师用户,并将其分配给班级对象的子级组。当学校的校长或班主任想要查看其注册学生时,我可以通过过滤其用户组来应用对象级别权限。

我的问题是,这是正确的方法吗?每个学校/班级对象创建一个小组有意义吗?

1 个答案:

答案 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
    )