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直接解决这个问题,但我也不能这样做。。。