私は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 パッケージについては既に調査しました。特定のインスタンスに必要な機能を提供しているように見えます。シェルを介してオブジェクトのアクセス許可を個別に作成できますが、明らかにこの機能をモデルに組み込みたいと考えています。
理想的には、モデルが作成されるときに、ユーザーを配置できるグループ (または権限?) が利用可能になります。
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
オブジェクトのアクセス許可ごとにプログラムでグループを作成するのが理想的だと思いますか? しかし、モデルが削除された場合、それらのグループを削除する必要がありますか? また、グループがシステムを過度に複雑にし、むしろプログラムで生成されたアクセス許可に依存し、グループを完全に回避しているように感じますか? このようなユニークな許可スキームを作成する必要がなかったので、私は本当に何らかの方向性を探しています. すべてのアドバイスは大歓迎です。