怎样才能把几个QuerySets编织成一个呢?我的意思是加入另一个QuerySet,交替它们的元素,而不对每个单独的QuerySet进行评估,从而保持性能。例如:
#QuerySets to be weaved
q1 = Model.objects.filter(...)
q2 = Model.objects.filter(...)
q3 = Model.objects.filter(...)
#The QuerySet in which the previous ones are weaved
WeaveQuery = ???? 因此,WeaveQuery的第一个元素属于q1,第二个元素属于q2,第三个元素属于q3,第四个元素属于q1。诸若此类。编织的QuerySets可能没有相同的长度,因此如果其中一个编织的查询集耗尽了元素,则不应该在WeaveQuery中重复这些元素。
发布于 2018-12-25 18:34:59
如果这对您来说足够,那么要获得QuerySet结果的一次迭代器,您可以这样做:
# works as is in Python 3
# in Python 2.7, there are similar functions with different names
from itertools import chain, filterfalse, zip_longest
weaved = filterfalse(
lambda x: x is None,
chain.from_iterable(zip_longest(q1, q2, q3))
)zip_longest将查询集压缩到一起,用None填充空的空格(当其中一个比其他的长)。chain将压缩压缩,因此您实际上得到了结果列表,而不是结果元组列表。filterfalse过滤掉我们从zip_longest获得的所有None元素明显的缺陷是,结果不是QuerySet,而是QuerySet结果的迭代器。但是,也许这对你来说就足够了?伟大的是,结果是迭代器,没有任何东西被过早地评估,所以编织本身燃烧得很快。
我担心以这种方式创建真正的QuerySet (而不实际评估任何东西)将是相当困难的。
https://stackoverflow.com/questions/53921931
复制相似问题