2010-12-10 45 views
50

我有兩個自定義管理器方法的Django模型。每個都根據對象的不同屬性返回模型對象的不同子集。如何找到兩個Django查詢集的聯合?

有沒有什麼辦法來獲得一個查詢集,或只是一個對象列表,這是每個管理器方法返回的查詢集的聯合?

+2

(來自已刪除的答案)查看此問題,以獲得適用於不同模型的QuerySets的變體:http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in -a-django-view – rnevius 2016-03-21 13:20:55

+1

從版本1.11開始,django查詢集具有內置聯合方法。我已經將它作爲未來參考的答案 – 2017-08-09 01:44:07

回答

127

這工作,看起來有點清潔:

records = query1 | query2 

如果你不想重複,那麼你將需要追加.distinct()

records = (query1 | query2).distinct() 
+4

0123雖然接受的答案返回一個union迭代(準確的列表),就像OP所要求的,但此方法返回查詢集的真正聯合。這個查詢集可以進一步操作,這在很多情況下都是需要的。 – 2013-01-09 15:10:21

+4

由於Django的bug,這個構造有時會在處理'ManyToManyField'時返回不正確的結果。例如,你有時會看到'records.count()'將大於'query1.count()+ query2.count()',這顯然是不正確的。 – Jian 2013-04-24 00:00:13

+4

@Jian你能澄清django版本的bug和djangoproject問題的鏈接嗎? – IMFletcher 2013-05-03 01:59:12

16

version 1.11開始,Django的查詢集有一個內置聯合方法。

q = q1.union(q2) #q will contain all unique records of q1 + q2 
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates 
q = q1.union(q2,q3) # more than 2 queryset union 

有關更多示例,請參閱我的blog post