如何将两个带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
相关产品推荐
相关产品推荐

