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

126 投票
3 回答
80503 浏览
提问于 2025-04-16 08:21

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

有没有办法得到一个查询集,或者说只是一个对象的列表,这个列表是每个管理方法返回的查询集的并集呢?

3 个回答

11

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

1.11版本开始,Django的查询集(querysets)里有一个内置的合并(union)方法。

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

想看更多例子,可以看看我的博客文章

223

这个方法有效,而且看起来更简洁一些:

records = query1 | query2

如果你不想要重复的内容,那你需要加上 .distinct()

records = (query1 | query2).distinct()

撰写回答