Python 复杂Django查询

Python 复杂Django查询,python,django,Python,Django,我有这些模型: class Person(models.Model): position = models.CharField(max_length=64) group = models.ForeignKey('Group') class Group(models.Model): ... 现在我需要一个查询,它将返回所有不同的组,其中每个组中的所有人都有一个工人职位。所以我会让所有的小组都只有工人。怎么做 我从以下几点开始: groups = Group.object

我有这些模型:

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

class Group(models.Model):
    ...
现在我需要一个查询,它将返回所有不同的
,其中每个组中的所有人都有一个工人职位。所以我会让所有的小组都只有工人。怎么做

我从以下几点开始:

groups = Group.objects.filter(person__position='worker').distinct()
但有了这些,我就有了一些非工人的团体

例如,我的查询应该返回group1,而不是group2:

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

group2
    person4 -> position=worker
    person5 -> position=looser
    person6 -> position=sleeper
查看注释:

我记不起确切的语法,但您应该能够用position=“worker”以及总人数为每个组添加注释,然后仅将其过滤到这两个计数相等的组中。

这应该可以:

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安装。

您的意思是要查找只具有
位置
等于
“worker”
且没有其他值的
型号?完全正确!为了更清楚,我在问题中添加了一个例子。不幸的是,这不起作用。它在
Group.objects.filter(person\uu position=“worker”)
中基本相当,因为不从
排除
取消
~Q
的不。两个查询都给出相同的结果。哦,太好了!非常有趣的方法。我试过了,效果很好!我需要使它适应我的真实模型(它们肯定比我的示例更复杂)。但我很肯定它会起作用的。对于我的真实模型,我能够在
Q
查询中使用
id
,因此
lt
gt
一定能工作。谢谢。你的想法看起来不错,但不幸的是我没能实现。我找不到正确的写作方法。事实上,我试图用SQL直接解决这个问题,但我也不能这样做。。。