我有一个带有两个自定义管理器方法的 Django 模型。每个都根据对象的不同属性返回模型对象的不同子集。
有没有办法获得一个查询集,或者只是一个对象列表,这是每个管理器方法返回的查询集的联合?
这有效,看起来更干净:
records = query1 | query2
如果您不想重复,则需要附加 .distinct()
:
records = (query1 | query2).distinct()
从 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。
我建议使用 'query1.union(query2)' 而不是 'query1 |查询2';我从上述两种方法得到了不同的结果,前一种是我所期望的。以下是我遇到的情况:
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
不定期副业成功案例分享
ManyToManyField
时有时会返回不正确的结果。例如,您有时会看到records.count()
会大于query1.count() + query2.count()
,这显然是不正确的。QuerySet
类为__and__
和__or__
提供了在两个QuerySet
对象之间使用&
或|
运算符时调用的方法(也用于 { 9} 类)。