如何找到两个 Django 查询集的并集?

我有一个带有两个自定义管理器方法的 Django 模型。根据对象的不同属性,每个对象返回模型对象的不同子集。

有没有办法获得一个查询集,或者仅仅是一个对象列表,它是每个管理器方法返回的查询集的联合?

70047 次浏览

这种方法很有效,而且看起来更干净一些:

records = query1 | query2

如果您不想要重复,那么您需要附加 .distinct():

records = (query1 | query2).distinct()

Starting from 版本1.11, django querysets have a builtin union method.

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

更多例子请参见我的 博客文章

我建议使用“ query1.union (query2)”而不是“ query1 | query2”; 我从上述两种方法中得到了不同的结果,前一种方法正是我所期望的。 以下是我所看到的:

print "union result:"
for element in query_set1.union(query_set2):
print element


print "| result:"
for element in (query_set1 | query_set2):
print element

结果:

union result:
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object


| result:
KafkaTopic object
KafkaTopic object