我在django项目中使用以下模型。有效的关系是,学区可以有多个学校,学校可以有多个学生,学生可以有多个学校。
class District(models.Model):
name = models.CharField(max_length=50)
...
class Meta:
permissions = (
('view_district', 'Can view district')
...
)
class School(models.Model):
name = models.CharField(max_length=50)
...
district = models.ForeignKey(
District,
on_delete=models.PROTECT,
related_name='schools',
related_query_name='school',
)
class Meta:
permissions = (
('view_school', 'Can view school')
...
)
class Student(models.Model):
name = models.CharField(max_length=50)
...
school = models.ForeignKey(
School,
on_delete=models.PROTECT,
related_name='students',
related_query_name='student',
)
class Meta:
permissions = (
('view_student', 'Can view student')
...
)
class Case(models.Model):
name = models.CharField(max_length=50)
...
student = models.ForeignKey(
Student,
on_delete=models.PROTECT
related_name='cases',
related_query_name='case',
)
class Meta:
permissions = (
('view_case', 'Can view case')
...
)
可能会为用户分配:
用户(管理员除外)只能查看/编辑/删除已被授予权限的模型。管理员将拥有所有模型的前任权限以及添加新模型。管理员最终会"分配"谁可以访问什么,组似乎是扩展这些功能的自然方式。
我知道django没有为实例级权限提供本机支持,因此我已经探索了django-guardian包。它似乎提供了特定实例所需的功能,虽然我可以通过shell单独为对象创建权限,但我显然希望在模型中构建此功能。
理想情况下,在创建模型时,可以使用组(或权限?)来放置用户,例如
District | District1 | can view District1
District | District1 | can edit District1
District | District1 | can delete District1
....
School | School1 | can view School1
School | School1 | can edit School1
School | School1 | can delete School1
我认为以编程方式为每个对象创建群组权限是理想的吗?但是,如果模型被删除,那么我需要删除这些组?我也觉得组可能会使系统过于复杂,而是依赖于以编程方式生成的权限并完全避免群组?我真的在寻找一个方向,因为我从来不需要创建这样一个唯一的权限方案。非常感谢任何和所有的建议。