帮助Django ORM中的复杂连接

时间:2009-03-13 18:44:09

标签: python django django-models

class Domains(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length= 60)
    user = models.ManyToManyField("Users", blank=True, null=True)
    def __unicode__(self):
        return self.name

class Groups(models.Model):
    domain = models.ForeignKey(Domains)
    name = models.CharField(max_length=30)
    description = models.CharField(max_length= 60)
    def __unicode__(self):
        return self.name

class Users(models.Model):
    login = models.CharField(max_length=30, unique=True)
    group = models.ManyToManyField(Groups, blank=True, null=True)
    def __unicode__(self):
        return self.login

我有上面的模型。需要一些与Django ORM合作的帮助。 如何构建查询以返回仅属于用户所属域的所有组名称

2 个答案:

答案 0 :(得分:4)

我的第二个elo80ka关于为你的模型使用单数名称的评论。要按域和用户过滤组,请尝试:

Groups.objects.filter(domain__user=u)

这将在多对多中执行适当的连接。如上所述,查询将返回组对象。如果您只想要name属性,请将.values_list('name', flat=True)附加到查询中,如elo80ka所示。

答案 1 :(得分:2)

您应该为模型类使用单数名称。例如,我将模型重写为:

class Domain(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length= 60)
    user = models.ManyToManyField('User', blank=True, null=True)

    def __unicode__(self):
            return self.name

class Group(models.Model):
    domain = models.ForeignKey(Domain, related_name='groups')
    name = models.CharField(max_length=30)
    description = models.CharField(max_length= 60)

    def __unicode__(self):
            return self.name

class User(models.Model):
    login = models.CharField(max_length=30, unique=True)
    group = models.ManyToManyField(Group, related_name='users', blank=True, null=True)

    def __unicode__(self):
            return self.login

由于您的用户与群组直接相关,因此您根本不需要涉及域。要获取特定用户的所有组名,您可以:

Group.objects.filter(users__pk=...).values_list('name', flat=True)

将'...'替换为您感兴趣的用户的ID。