Django中如何将循环生成的多个QuerySet合并为单个QuerySet
方案1:直接使用__in查询(最推荐,无需循环)
你的需求是筛选brand为1或2的记录,直接使用Django ORM的in查询即可一步得到合并后的QuerySet,性能最优,且支持后续ORM链式操作:
merged_qs = Gpu.objects.filter(brand__in=[1,2]) print(merged_qs)
输出结果就是你期望的合并后单个QuerySet效果。
方案2:使用QuerySet.union()方法(适用于两个独立QuerySet合并的通用场景)
如果两个QuerySet是通过不同逻辑生成、无法合并为单个filter查询的,可以用Django内置的union方法合并,返回结果依然是QuerySet类型:
# 先生成两个独立的QuerySet qs1 = Gpu.objects.filter(brand=1) qs2 = Gpu.objects.filter(brand=2) # 合并两个QuerySet merged_qs = qs1.union(qs2) print(merged_qs)
注意:union默认会自动去重,如果需要保留重复记录可以传入all参数:qs1.union(qs2, all=True),该方法要求两个QuerySet返回的字段数量、类型完全一致,同模型查询天然满足该条件。
方案3:用itertools.chain合并(仅需遍历数据不需要ORM操作时使用)
如果你不需要对合并结果调用filter、order_by等ORM方法,只是要遍历所有对象,可以用该方法,返回的是可迭代对象,可直接转列表使用:
from itertools import chain qs1 = Gpu.objects.filter(brand=1) qs2 = Gpu.objects.filter(brand=2) merged_list = list(chain(qs1, qs2))
注意:该方法返回的不是QuerySet类型,无法再调用任何ORM方法。
内容的提问来源于stack exchange,提问作者khalid saad
相关产品推荐
相关产品推荐

