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

如何将两个带annotate注解的Django查询合并为单个查询?

Django 两个条件聚合查询合并方案

你可以使用Django ORM的条件聚合能力将两次查询合并为单次查询,无需请求两次数据库,具体实现如下:

首先导入需要的ORM工具函数:

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

合并后的查询语句:

bb = Users.objects.annotate(
    likes=Sum(
        Case(
            When(comments__likedislike__gt=0, then='comments__likedislike'),
            default=0,
            output_field=IntegerField()
        )
    ),
    dislikes=Sum(
        Case(
            When(comments__likedislike__lt=0, then='comments__likedislike'),
            default=0,
            output_field=IntegerField()
        )
    )
# 如果需要过滤掉没有任何点赞/点踩记录的用户,和原两次查询的合并去重结果对齐,保留下面这行
).exclude(likes=0, dislikes=0)

说明

  • 方案把原两次查询的过滤条件直接嵌入到注解的求和逻辑中,仅对符合条件的关联评论值做累加,不符合条件的项默认计入0,不影响求和结果
  • 最终返回的每个用户对象都会同时带有likes(总点赞值)和dislikes(总点踩值)两个属性,可直接调用
  • 相比两次查询后再合并结果的方案,单次条件聚合的执行性能更高,也不需要额外做结果去重处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:54:01