2012-01-21 33 views
0

是否有可能LEFT JOIN一個QuerySet到另一個?我知道這是可能的INNER JOIN二,如下:左加入一個QuerySet到另一個

QuerySet1.filter(foreign_key__in=QuerySet2)

有沒有什麼辦法來達到類似的效果,但與LEFT而非INNER JOIN

回答

2

這不是內連接。這是一個子選擇查詢,它提供了查詢集2中所有具有它們的FK的所有結果 - 但它不是連接,因爲最後只有Q1表中的元素,而不是q2中的元素。

做一個實際連接的唯一方法 - 即從一個查詢中的兩個表中獲取元素 - 是使用select_related。這裏發生的是,table1中的外鍵關係預先填充了連接的結果。因此,默認情況下,這是一個左連接,而不是內連接,因爲您獲取table1的元素,無論table2中是否存在任何匹配。

您可以結合使用這兩種技術來模擬內部連接:QuerySet1.select_related().filter(foreign_key__in=QuerySet2)但我不確定查詢創建者是否足夠聰明,可以將這些連接組合成單個連接,或者它是否會執行連接+子查詢。

0

LEFT OUTER JOIN要從第一個查詢集合中的所有結果的工具,那麼,響應你的答案是:

QuerySet1.all() 

記住,你可以用select_related選擇相關的表格屬性:

QuerySet1.select_related('model2__model3__some_property') 

這將生成模型2的左連接外鍵允許空值。