如何找到两个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