关于python:如何在DJANGO中合并多个查询集

How to merge multiple query sets in DJANGO

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
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)
...

每个结果_列表都包含项目,它们具有唯一的数字ID,我可以使用它来确保没有重复。

查询db或q对象时不能使用。

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


稍微修改一下itertools.chain,确保你不会被欺骗,怎么样?

1
2
3
4
5
6
7
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

通过它,您可以创建组合列表:

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


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

1
2
3
4
5
6
import itertools

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

for element in merged:
    print(element)