爲什麼不把兩種方法混合在一起? 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。
[django一對多關係]的可能重複(http://stackoverflow.com/questions/10975140/django-one-to-many-relation) – jpic