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

时间:2010-12-10 16:32:45

标签: python django django-models

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

有没有办法获取查询集,或只是一个对象列表,这是每个管理器方法返回的查询集的并集?

3 个答案:

答案 0 :(得分:152)

这有效并且看起来更清洁:

records = query1 | query2

如果您不想复制,则需要附加.distinct()

records = (query1 | query2).distinct()

答案 1 :(得分:38)

version 1.11开始,django querysets有一个内置联合方法。

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

答案 2 :(得分:2)

我建议使用'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