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

4 投票
2 回答
8101 浏览
提问于 2025-04-18 07:02

我需要把下面的查询结果合并成一个列表:

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,我可以用这个ID来确保没有重复的内容。

我不能在查询数据库的时候使用 | 符号或者 Q 对象。

那我该怎么把这些结果合并成一个列表呢?

2 个回答

3

那么你就不能使用 QuerySet 及其在 Django 中的功能了,不过你可以使用 itertools.chain,这个工具专门用来合并多个可迭代对象。

import itertools

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

for element in merged:
    print(element)
5

关于对 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, ... ))

撰写回答