2010-02-02 172 views
30

是否有扩展内置Django Group对象的方法来添加其他属性,类似于您可以扩展用户对象的方式?随着用户对象,你可以做到以下几点:如何扩展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() 

是否有任何等效以这种方式扩展组?如果不是,我可以采取另一种方法吗?

回答

17

您可以创建一个模型,将子类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 
36

如果你简单地继承Group对象则默认情况下它会创建一个新的数据库表和管理网站不会回暖任何新的领域。

你需要注入新的字段到现有组:

if not hasattr(Group, 'parent'): 
    field = models.ForeignKey(Group, blank=True, null=True, related_name='children') 
    field.contribute_to_class(Group, 'parent') 

的方法添加到组,子类,但标注的模型作为代理:

class MyGroup(Group): 

    class Meta: 
     proxy = True 

    def myFunction(self): 
     return True 
+0

感谢您给我们! – Simanas 2013-06-06 12:12:28

+6

'if not hasattr(Group ...'line goes? – ModernCarpentry 2014-02-07 17:25:00

+0

您可以将它放在models.py上面MyGroup – Mark 2015-11-10 23:10:57