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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:45:03