【问题标题】:How to merge multiple query sets in DJANGO [duplicate]如何在 DJANGO 中合并多个查询集 [重复]
【发布时间】:2014-07-08 00:58:15
【问题描述】:

我必须将下面的查询集合并到一个列表中:

result_list_1 = Col.objects.defer("tags").filter(producer__username__icontains=crit) 
result_list_2 = Col.objects.defer("tags").filter(name__icontains=crit)
result_list_3 = Col.objects.defer("tags").filter(description__icontains=crit)
result_list_4 = Col.objects.filter(tags__name__icontains=crit)
...

每个 result_list 都包含项目,这些项目有一个唯一的数字 id,我可以使用它来确保没有重复。

我不能使用 |在查询 DB 或 Q 对象时。

如何将结果集合并到一个列表中?

【问题讨论】:

  • 谢谢亚历克斯,我看到了那个。评论中有关于合并元素不重复的参考,但不是很清楚。
  • 感谢 Steinar,没有 Q 对象。
  • 但是为什么呢?如果您就您的问题向我们提供一些背景信息,那么为您提供解决方案可能会更容易。
  • 上面的代码示例只显示了 4 个查询集,但实际上我有更多,其中一些具有更复杂的过滤条件。它们不能组合。我必须合并生成的查询集。

标签: python django


【解决方案1】:

itertools.chain 稍作修改以确保您不会受到欺骗:

def unique_chain(*iterables):
    known_ids = set()
    for it in iterables:
        for element in it:
            if element.id not in known_ids:
                known_ids.add(element.id)
                yield element

你可以创建你的组合列表:

combined_list = list(unique_chain(result_list_1, result_list_2, ... ))

【讨论】:

  • 谢谢史蒂芬斯。那成功了。我怀疑可能有更有效的方法,但这个方法有效。
【解决方案2】:

那么你不能有QuerySet,它是与django相关的功能,但你可以使用itertools.chain,它专门用于合并多个迭代。

import itertools

merged = itertools.chain(qs1, qs2, qs3, qs4)

for element in merged:
    print(element)

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 2017-03-09
    • 2013-09-06
    • 2014-01-27
    • 2019-08-11
    • 2021-11-10
    • 2017-10-09
    • 2012-12-20
    • 2017-12-04
    相关资源
    最近更新 更多