是否有可能LEFT JOIN
一個QuerySet
到另一個?我知道這是可能的INNER JOIN
二,如下:左加入一個QuerySet到另一個
QuerySet1.filter(foreign_key__in=QuerySet2)
有沒有什麼辦法來達到類似的效果,但與LEFT
而非INNER JOIN
?
是否有可能LEFT JOIN
一個QuerySet
到另一個?我知道這是可能的INNER JOIN
二,如下:左加入一個QuerySet到另一個
QuerySet1.filter(foreign_key__in=QuerySet2)
有沒有什麼辦法來達到類似的效果,但與LEFT
而非INNER JOIN
?
這不是內連接。這是一個子選擇查詢,它提供了查詢集2中所有具有它們的FK的所有結果 - 但它不是連接,因爲最後只有Q1表中的元素,而不是q2中的元素。
做一個實際連接的唯一方法 - 即從一個查詢中的兩個表中獲取元素 - 是使用select_related
。這裏發生的是,table1中的外鍵關係預先填充了連接的結果。因此,默認情況下,這是一個左連接,而不是內連接,因爲您獲取table1的元素,無論table2中是否存在任何匹配。
您可以結合使用這兩種技術來模擬內部連接:QuerySet1.select_related().filter(foreign_key__in=QuerySet2)
但我不確定查詢創建者是否足夠聰明,可以將這些連接組合成單個連接,或者它是否會執行連接+子查詢。
LEFT OUTER JOIN要從第一個查詢集合中的所有結果的工具,那麼,響應你的答案是:
QuerySet1.all()
記住,你可以用select_related選擇相關的表格屬性:
QuerySet1.select_related('model2__model3__some_property')
這將生成模型2的左連接外鍵允許空值。