首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编织(连接交变元素)几个Django QuerySets

如何编织(连接交变元素)几个Django QuerySets
EN

Stack Overflow用户
提问于 2018-12-25 11:26:53
回答 1查看 43关注 0票数 0

怎样才能把几个QuerySets编织成一个呢?我的意思是加入另一个QuerySet,交替它们的元素,而不对每个单独的QuerySet进行评估,从而保持性能。例如:

代码语言:javascript
复制
#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中重复这些元素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-25 18:34:59

如果这对您来说足够,那么要获得QuerySet结果的一次迭代器,您可以这样做:

代码语言:javascript
复制
# 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 (而不实际评估任何东西)将是相当困难的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53921931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档