如何仅将几个QuerySet编织在一起?我的意思是将他们加入另一个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 ...,依此类推。编织查询集的长度可能不相同,因此如果编织查询集之一用完了元素,则不应在WeaveQuery中重复元素。
答案 0 :(得分:2)
如果需要的话,要获得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
过滤掉我们从None
获得的所有zip_longest
元素一个明显的缺陷是,结果不是QuerySet,它只是QuerySet结果的迭代器。但是,也许对您来说足够了?很棒的是,结果是迭代器,没有任何东西被过早评估,因此编织本身很快就燃烧起来。
恐怕以这种方式(没有实际评估任何东西)创建真正的QuerySet会很困难。