【发布时间】:2012-01-21 21:29:02
【问题描述】:
可以LEFT JOIN 一个QuerySet 到另一个吗?我知道INNER JOIN两个是可以的,如下:
QuerySet1.filter(foreign_key__in=QuerySet2)
有什么方法可以达到类似的效果,但使用LEFT 而不是INNER JOIN?
【问题讨论】:
标签: mysql sql django django-models
可以LEFT JOIN 一个QuerySet 到另一个吗?我知道INNER JOIN两个是可以的,如下:
QuerySet1.filter(foreign_key__in=QuerySet2)
有什么方法可以达到类似的效果,但使用LEFT 而不是INNER JOIN?
【问题讨论】:
标签: mysql sql django django-models
这不是内部连接。这是一个子选择查询,它为您提供 queryset1 的所有结果,它们的 FK 在查询集 2 中 - 但它不是连接,因为最后您只有 Q1 表中的元素,而不是 q2 中的元素。
进行真正连接的唯一方法——即在一个查询中从两个表中获取元素——是使用select_related。这里发生的是 table1 中的外键关系预先填充了连接的结果。因此,默认情况下,这是一个左连接,而不是内连接,因为无论 table2 中是否有任何匹配项,您都会获得 table1 的元素。
您可以结合这两种技术来模拟内部连接:QuerySet1.select_related().filter(foreign_key__in=QuerySet2) 但我不确定查询创建者是否足够聪明,可以将它们组合成一个连接,或者它是否会执行连接 + 子选择。
【讨论】:
左外连接表示您想要第一个查询集的所有结果,那么,对您的回答的响应是:
QuerySet1.all()
记住你可以用select_related选择相关的表属性:
QuerySet1.select_related('model2__model3__some_property')
这将为model2生成一个左连接外键,允许空值。
【讨论】: