将一个QuerySet连接到另一个QuerySet

时间:2012-01-21 21:29:02

标签: mysql sql django django-models

是否可以将LEFT JOIN一个QuerySet转让给另一个人INNER JOIN?我知道QuerySet1.filter(foreign_key__in=QuerySet2)两个可能如下:

LEFT

有没有办法达到类似效果,但使用INNER JOIN而不是{{1}}?

2 个答案:

答案 0 :(得分:2)

这不是内部联接。它是一个子选择查询,它为您提供queryset1在查询集2中具有FK的所有结果 - 但它不是连接,因为最后您只有Q1表中的元素,而不是q2中的元素。

进行实际连接的唯一方法 - 即在一个查询中从两个表中获取元素 - 是使用select_related。这里发生的是table1中的外键关系预先填充了连接的结果。所以,默认情况下,这是一个左连接,而不是内连接,因为你得到table1的元素,无论table2中是否有任何匹配。

您可以结合使用这两种技术来模拟内部联接:QuerySet1.select_related().filter(foreign_key__in=QuerySet2)但我不确定查询创建者是否足够聪明,可以将它们组合成单个联接,或者它是否会执行联接+ a子查询中。

答案 1 :(得分:0)

左外连接意味着您需要来自第一个查询集的所有结果,然后,对您的答案的响应是:

QuerySet1.all()

请记住,您可以使用select_related选择相关的表格属性:

QuerySet1.select_related('model2__model3__some_property')

这将生成一个左连接外键到model2允许空值。