一尘不染

如何扩展Django Group模型?

django

有没有一种方法可以扩展内置的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()

扩展小组有什么等效方法吗?如果没有,我是否可以采用其他方法?


阅读 1448

收藏
2020-03-30

共2个答案

一尘不染

你可以创建一个对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
2020-03-30
一尘不染

如果仅对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
2020-03-30