如何使用django QuerySet API爲跨M2M關係芯片的完整外連接創建查詢?django中的完整外連接
這不被支持,關於創建我自己的經理來做這件事的一些暗示將受到歡迎。
編輯補充: @美國洛特: 謝謝你的啓示。 OUTER JOIN的需求來自應用程序。它必須生成一份顯示輸入數據的報告,即使它仍然不完整。 我沒有意識到結果會是一個新的班級/模型。你的提示會對我有所幫助。
如何使用django QuerySet API爲跨M2M關係芯片的完整外連接創建查詢?django中的完整外連接
這不被支持,關於創建我自己的經理來做這件事的一些暗示將受到歡迎。
編輯補充: @美國洛特: 謝謝你的啓示。 OUTER JOIN的需求來自應用程序。它必須生成一份顯示輸入數據的報告,即使它仍然不完整。 我沒有意識到結果會是一個新的班級/模型。你的提示會對我有所幫助。
Django不支持通常SQL意義上的「連接」 - 它支持對象導航。
請注意,關係連接(內部或外部)會創建一個新的「實體類」。一個在Django中沒有定義的人。所以沒有適當的「結果集」,因爲沒有類定義你回頭的東西。你可以做的最好的事情是定義一個元組,這個元組將會與None一起被包含在缺失的組合中。
左(或右)外連接看起來像這樣。它創建了兩個不相交的子集,那些擁有相關聯的實體集的人,以及那些沒有相關實體的人。
for obj in Model1.objects.all():
if obj.model2_set().count() == 0:
# process (obj, None) -- no Model2 association
else:
for obj2 in obj.model2_set.all():
# process (obj, obj2) -- the "inner join" result
「完整」外連接是沒有關係的其餘項的聯合。
for obj2 in Model2.objects.all():
if obj2.model1_set().count() == 0:
# process (None, obj2) -- no Model1 association
的問題始終是,什麼樣的處理是你的對象的三個不同的子這個奇怪的集合在做什麼?
對象數據庫的要點是將處理集中在對象及其關聯的對象上。
稱爲「關係連接」的特有集合絕不會在原始對象模型中。它是由兩個(或更多)原始對象構建的一類新對象。
更糟的是,外連接創建了一個包含多個子類(內連接,左外連接和右外連接)的集合。那東西是什麼意思?
等等,它可能會變得更糟。如果處理包括檢查缺少的屬性(即if someObj.anObj2attribute is None
:我們實質上是在尋找Model1
項目,而沒有Model2
對象關聯。嗯...爲什麼我們把它們放在外連接中,只是用if
語句過濾它們?爲什麼不只是做單獨的查詢AMD過程中的每個子集適當
編輯:。當你呈現「未完成」狀態,它不是一個外連接在所有它的簡單得多,您需要創建一個或兩個單獨的集合在你的視圖函數中用於你的模板顯示
首先,你應該使用狀態碼,而不是存在或取消外鍵的作用。可選的外鍵沒有「理由」 - 它們在那裏或不在那裏。狀態代碼可以提供有用的意義陰影(「不完整」,「錯誤」,「中斷」,「不適用」,「待刪除」等)。)
errorList1 = Model1.objects.filter(status="Incomplete")
errorList2 = Model2.objects.filter(status="Incomplete")
這兩個是完整外連接的兩個非連接部分。然後,您可以在模板中使用適當的列標題和狀態代碼以及所有內容顯示這兩個錯誤列表。
你甚至可以把它們放到一個表來模仿舊的完整外連接見慣
<table>
<tr><th>Model1</th><th>Model2</th></tr>
{% for e1 in errorList1 %}
<tr><td>e1</td><td>NULL</td></tr>
{% endfor %}
{% for e2 in errorList2 %}
<tr><td>NULL</td><td>e2</td></tr>
{% endfor %}
</table>
看起來像一個完全外部報告的人加入報告中。沒有完整的外連接。
科林,我一起工作的人之一,寫了一段時間後回這樣做在Django自聯接:
http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/
你也許可以找到一些有用的存在!
你說得對。我將編寫一個視圖,計算python中我的「FULL OUTER JOIN」的必要表,然後將結果傳遞給模板進行渲染。 謝謝。 – Ber 2008-10-31 15:05:40