复杂的Django查询

时间:2011-02-04 04:31:19

标签: python django

我有这些模特:

class Person(models.Model):
    position = models.CharField(max_length=64)
    group = models.ForeignKey('Group')

class Group(models.Model):
    ...

现在我想要一个查询,它会返回所有不同的Group,其中每个组中的所有人都有 worker 的位置。因此,我将让所有团体中只有工人。怎么做?

我开始时:

groups = Group.objects.filter(person__position='worker').distinct()

但是有了这个,我的团体中的人不是 worker

例如,我的查询应返回group1但 group2:

group1
    person1 -> position=worker
    person2 -> position=worker
    person3 -> position=worker

group2
    person4 -> position=worker
    person5 -> position=looser
    person6 -> position=sleeper

2 个答案:

答案 0 :(得分:2)

这应该有效:

Group.objects.exclude(~Q(person__position="worker"))

修改:

以上不正确,所以这是我的第二次尝试:

Group.objects.filter(
    Q(person__position="worker") 
    & ~Q(person__position__gt="worker")
    & ~Q(person__position__lt="worker")
)

我不确定这是否可以用于所有数据库。它适用于我的PGSQL安装。

答案 1 :(得分:0)

查看注释:http://docs.djangoproject.com/en/dev/topics/db/aggregation/

我无法回想起确切的语法,但是您应该能够使用position =“worker”的人数以及人员总数来注释每个Group,然后将其过滤到只有那些人的组。两个计数相等。