Django执行原生SQL聚合查询如何获取单个标量数值而非可迭代对象
问题原因
Django 中 raw() 方法的返回值固定为 RawQuerySet 可迭代集合,哪怕SQL仅返回一行聚合结果,也不能直接拿到标量值,需要先从集合中取出实例再读取对应字段。
另外你原有代码中前置的 filter(creator=request.user) 是无效的,raw() 会直接执行自定义SQL,忽略所有前置的查询集方法,建议删除避免混淆。
方案1:基于现有raw查询修改
仅需在原有查询后补充取值逻辑即可:
pts = skills.objects.raw('''SELECT sum(cast(points as int)) as id FROM myapp_skills WHERE status = 'closed' and creator = %s ''',[request.user.username]) # 取第一条结果的id字段(你给sum结果设置的别名为id),无匹配数据时默认返回0 total_points = pts[0].id if len(pts) else 0
方案2(更推荐):使用ORM聚合函数实现,无需写原生SQL
Django 内置了类型转换和聚合方法,写法更简洁安全,也能直接返回标量结果:
首先导入依赖:
from django.db.models import Sum, IntegerField from django.db.models.functions import Cast
执行查询直接取值:
total_points = skills.objects.filter( creator=request.user.username, status="closed" ).aggregate( total=Sum(Cast("points", output_field=IntegerField())) )["total"] or 0
内容的提问来源于stack exchange,提问作者kikee1222
相关产品推荐
相关产品推荐

