我有兩個自定義管理器方法的Django模型。每個都根據對象的不同屬性返回模型對象的不同子集。如何找到兩個Django查詢集的聯合?
有沒有什麼辦法來獲得一個查詢集,或只是一個對象列表,這是每個管理器方法返回的查詢集的聯合?
我有兩個自定義管理器方法的Django模型。每個都根據對象的不同屬性返回模型對象的不同子集。如何找到兩個Django查詢集的聯合?
有沒有什麼辦法來獲得一個查詢集,或只是一個對象列表,這是每個管理器方法返回的查詢集的聯合?
這工作,看起來有點清潔:
records = query1 | query2
如果你不想重複,那麼你將需要追加.distinct()
:
records = (query1 | query2).distinct()
0123雖然接受的答案返回一個union迭代(準確的列表),就像OP所要求的,但此方法返回查詢集的真正聯合。這個查詢集可以進一步操作,這在很多情況下都是需要的。 – 2013-01-09 15:10:21
由於Django的bug,這個構造有時會在處理'ManyToManyField'時返回不正確的結果。例如,你有時會看到'records.count()'將大於'query1.count()+ query2.count()',這顯然是不正確的。 – Jian 2013-04-24 00:00:13
@Jian你能澄清django版本的bug和djangoproject問題的鏈接嗎? – IMFletcher 2013-05-03 01:59:12
從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。
(來自已刪除的答案)查看此問題,以獲得適用於不同模型的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.11開始,django查詢集具有內置聯合方法。我已經將它作爲未來參考的答案 – 2017-08-09 01:44:07