为什么不混合两种方法呢?Django 模型允许继承。首先定义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。