【问题标题】:Left joining one QuerySet to another左连接一个 QuerySet 到另一个
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      左外连接表示您想要第一个查询集的所有结果,那么,对您的回答的响应是:

      QuerySet1.all()
      

      记住你可以用select_related选择相关的表属性:

      QuerySet1.select_related('model2__model3__some_property')
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        相关资源
        最近更新 更多