有没有一种方法可以扩展内置的Django Group对象以添加其他属性,类似于可以扩展用户对象的方法?使用用户对象,你可以执行以下操作:
class UserProfile(models.Model): user = models.OneToOneField(User)
并将以下内容添加到settings.py文件中
AUTH_PROFILE_MODULE = 'app.UserProfile'
这使你:
profile = User.objects.get(id=1).get_profile()
扩展小组有什么等效方法吗?如果没有,我是否可以采用其他方法?
你可以创建一个对Group进行子类化的模型,添加自己的字段,并使用模型管理器返回所需的任何自定义查询集。这是一个截断的示例,显示了我如何扩展“组”以表示与学校关联的家庭:
from django.contrib.auth.models import Group, User class FamilyManager(models.Manager): """ Lets us do querysets limited to families that have currently enrolled students, e.g.: Family.has_students.all() """ def get_query_set(self): return super(FamilyManager, self).get_query_set().filter(student__enrolled=True).distinct() class Family(Group): notes = models.TextField(blank=True) # Two managers for this model - the first is default # (so all families appear in the admin). # The second is only invoked when we call # Family.has_students.all() objects = models.Manager() has_students = FamilyManager() class Meta: verbose_name_plural = "Families" ordering = ['name'] def __unicode__(self): return self.name
如果仅对Group对象进行子类化,则默认情况下它将创建一个新的数据库表,并且管理站点将不会选择任何新字段。
你需要向现有组中注入新字段:
if not hasattr(Group, 'parent'): field = models.ForeignKey(Group, blank=True, null=True, related_name='children') field.contribute_to_class(Group, 'parent')
要将方法添加到Group中,请子类化,但将模型标记为代理:
class MyGroup(Group): class Meta: proxy = True def myFunction(self): return True