2012-06-19 60 views
5

我正在研究允許不同學校在線管理其內容的產品。Django組和權限。擴展組以擁有FK?

這包括設置一個我自己編寫的基於角色的訪問控制邏輯。基本上,每所學校都有自己的一套角色,擁有自己的一套權限。該軟件的用戶可以在任何特定時間屬於具有不同角色的多所學校。

由於各種原因,我想摒棄這一點,改爲使用Django的組和權限以及像django-guardian這樣的庫。我面臨的問題是如何擴展組模型,以便我可以爲每個新學校添加一個外鍵,並且仍然可以使用Django中的助手方法以及django-guardian等庫。

我想出的一種可能方法是根據事件名稱創建組,例如'學校1 - 管理員','學校1 - 教師','學校2 - 管理員','學校2 - 教師'和改爲基於此查詢權限。爲什麼我不應該這樣做是否有充分的理由?

+0

[django一對多關係]的可能重複(http://stackoverflow.com/questions/10975140/django-one-to-many-relation) – jpic

回答

0

爲什麼不把兩種方法混合在一起? Django模型允許inheritence。首先定義Role模型,允許角色和學校模型。

然後你可以從django.contrib.auth.Group繼承一個新模型,比如GroupRole。 Django將爲您的模型創建一個新的數據庫表,只包含最初不在組中的屬性,而是包含具有約束條件的適當組的外鍵。更妙的是,你會得到原始組模型的自動反向關係,所以你可以寫這樣的:

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。