You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django链式合并带不同注解的QuerySet时注解值异常如何解决

问题根因

你之前的写法失效是因为Django ORM中使用|运算符合并两个QuerySet时,只会保留第一个QuerySet的注解配置,第二个QuerySet的weight=0注解会被直接丢弃,最终合并后的查询只会给所有对象统一赋值第一个注解的Value(1)。

解决方案

下面提供两种可直接落地的实现方式:

方案1:使用条件注解(推荐)

无需拆分QuerySet,直接通过Case/When在单次查询中根据字段值动态生成注解,性能最优、逻辑更简洁:
首先导入依赖模块:

from django.db.models import Case, When, Value, IntegerField

查询代码:

queryset = Location.objects.annotate(
    weight=Case(
        When(dummy=True, then=Value(1)),
        default=Value(0),
        output_field=IntegerField()
    )
)

方案2:使用union方法合并QuerySet

如果业务需要拆分两个查询再合并,可以用union替代|运算符,会保留两个查询各自的注解值:

queryset = Location.objects.all()
queryset_1 = queryset.filter(dummy=True).annotate(weight=Value(1, IntegerField()))
queryset_2 = queryset.filter(dummy=False).annotate(weight=Value(0, IntegerField()))
# 两个查询过滤条件互斥,加all=True跳过去重可提升性能
queryset = queryset_1.union(queryset_2, all=True)

内容的提问来源于stack exchange,提问作者Dalvtor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:45:04