如何在DJANGO中合并多个查询集

时间:2014-05-19 22:44:50

标签: python django

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

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对象。

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

2 个答案:

答案 0 :(得分:4)

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, ... ))

答案 1 :(得分:3)

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

import itertools

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

for element in merged:
    print(element)