Django中如何将两个不同模型的queryset合并为单个queryset而非列表?
解决方案
Django 原生 QuerySet 本质绑定单个模型的数据库表结构,仅当两个待合并的模型字段结构完全匹配(或你查询的公共字段集的数量、类型完全一致)时,才能通过官方提供的 union() 方法得到原生 QuerySet 类型的合并结果,这也是唯一不转成列表的原生方案:
# 示例1:两个模型字段完全一致,可直接合并 a = Modelone.objects.all() b = Modeltwo.objects.filter(number__gte=4) c = a.union(b)
# 示例2:两个模型只有部分公共字段,指定相同的查询字段后合并 a = Modelone.objects.all().values("id", "title", "number") b = Modeltwo.objects.filter(number__gte=4).values("id", "title", "number") c = a.union(b)
注意事项
union()默认会自动去重,如需保留重复内容可以添加参数a.union(b, all=True)- 合并得到的
c是标准 Django QuerySet,支持后续调用filter()、order_by()、count()等原生 QuerySet 方法 - 若两个查询的字段数量、类型不匹配,运行时会抛出数据库层面的错误
如果两个模型字段结构差异较大,没有办法生成原生 QuerySet 合并结果,这类场景下的替代方案是使用第三方封装库 django-querysetsequence,它可以把多个 QuerySet 封装成一个支持绝大多数 QuerySet 接口的对象,不需要转成列表即可进行常用操作:
from queryset_sequence import QuerySetSequence a = Modelone.objects.all() b = Modeltwo.objects.filter(number__gte=4) c = QuerySetSequence(a, b)
内容的提问来源于stack exchange,提问作者coderDcoder
相关产品推荐
相关产品推荐

