如何编织(连接交替元素)几个Django QuerySet

时间:2018-12-25 11:26:54

标签: python django django-queryset

如何仅将几个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中重复元素。

1 个答案:

答案 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会很困难。