2012-06-19 10 views
5

私は、さまざまな学校がオンラインでコンテンツを管理できるようにする製品に取り組んでいます。Djangoグループとアクセス許可。グループを拡張してFKを取得する

これの一部は、自分自身で作成した役割ベースのアクセス制御ロジックを設定することです。本質的に、各学校には独自の権限セットを持つ独自のロールセットがあります。ソフトウェアのユーザーは、任意の時点で異なる役割を持つ複数の学校に所属することができます。

さまざまな理由から、私はこれを避けて、Djangoのグループとアクセス許可をdjango-guardianのようなライブラリとともに使用したいと思います。私が直面している問題は、グループのモデルを拡張して、それぞれの新しい学校に外部キーを組み込み、Djangoのヘルパーメソッドやdjango-guardianのようなライブラリを使用できるようにする方法です。

「School 1 - Admin」、「School 1-Teacher」、「School 2-Admin」、「School 2-Teacher」、および「School 2-Teacher」などのイベント名に基づいてグループを作成することも考えられます。代わりにこれに基づいてクエリのアクセス許可。このようにしてはならない理由はありますか?

+0

[django one-to-many relation](http://stackoverflow.com/questions/10975140/django-one-to-many-relation)の完全な実装について書いてあります。 – jpic

答えて

0

両方のアプローチを混在させてみませんか? Djangoモデルではinheritenceを使用できます。まず、許可された役割と学校モデルを使用してRoleモデルを定義します。

次に、新しいモデルをdjango.contrib.auth.Group、GroupRoleから継承できます。 Djangoは、当初はグループに属していなかったプロパティのみを含む適切なグループへの外部キーを持つモデルの新しいdbテーブルを作成します。さらに良いことに、あなたは元のグループのモデルへの自動逆の関係を取得しますので、あなたのような何か書くことができます。楽しいノートで

class GroupRole(Group): 
    role = models.ForeignKey(Role) 
    school = models.ForeignKey(School) 
    ... 

g = Group.objects.get(id=1) 
# you can access standard group items here g.<attribute> or g.grouprole.<attribute> 
# you can access GroupRole attributes by doing g.grouprole.<some_attribute> 

GroupRole.objects.filter(role__type='admin', school__location__state='NY') 

を、関係はとてもこのようなものはあまり有用ではない場合は有効である反射であります:

g.grouprole.grouprole.grouprole.grouprole.role 

あなたがそれに関連付けられたgrouproleプロキシは、あなたが、例外がスローされますがありません基本グループのインスタンスを取得する場合:

また
g = Group.objects.create(name='myplaingroup') 
try: 
    print g.grouprole 
except GroupRole.DoesNotExist: 
    print 'This is a normal group' 

を例外を発生させる代わりにこの動作をオーバーライドしてNoneを返すか、代わりにデフォルトのGroupRoleを提供することもできます。

関連する問題