Django查询 - 多个内部联接

时间:2017-10-30 11:41:07

标签: django django-orm

我们目前在使用django构建具有多个内部联接的复杂Q-object查询时遇到一些问题。

我们想要获得的模型(在示例中称为' main')由具有外键的另一个模型引用。反向引用称为“相关”'在下面的例子中。第二个模型中有许多对象都指的是同一个主要的'对象都有id和值。

我们希望得到所有主要的'存在具有id为7113的相关对象的对象具有值1和具有值为0的相关对象,其值为0。

这是我们当前的查询:

(Q(related__id=u'7313') & Q(related__value=1)) & (Q(related__id=u'7314') & Q(related__value=0))

此代码评估为

FROM `prefix_main` INNER JOIN `prefix_related` [...] WHERE (`prefix_related`.`id` = 7313 AND `prefix_related`.`value` = 1 AND `prefix_related`.`id` = 7314 AND `prefix_related`.`value` = 0)

我们需要的是完全不同的:

FROM `prefix_main` INNER JOIN `prefix_related` a INNER JOIN `prefix_related` b [...] WHERE (a.`id` = 7313 AND a.`value` = 1 AND b.`id` = 7314 AND b.`value` = 0)

如何重写ORM查询以使用两个INNER JOINS /为q-objects使用不同的相关实例?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你甚至不需要Q-objects。你可以使用这样的多个过滤器:

Mainmodel.objects.filter(related__id = 7114, related__value=1).filter(related__id = 7113, related__value=0)

第一个过滤器匹配具有id为7114且值为1的相关对象的所有对象。返回的对象再次使用id 7113和值0进行过滤。