2010-12-10 43 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