是否可以将LEFT JOIN
一个QuerySet
转让给另一个人INNER JOIN
?我知道QuerySet1.filter(foreign_key__in=QuerySet2)
两个可能如下:
LEFT
有没有办法达到类似效果,但使用INNER JOIN
而不是{{1}}?
答案 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允许空值。