Django框架中实现模型列值求和的正确ORM查询方法
问题原因
你写的ProductInstance.objects.sum(quantity)运行失败,核心是两个错误:
- Django 的 QuerySet 没有提供可直接调用的
sum()方法,字段聚合统计需要通过指定聚合入口搭配内置聚合函数实现 - 聚合统计传入的字段名需要用字符串格式,直接写
quantity会被识别为未定义变量,抛出名称错误
正确实现方式
- 先导入Django内置的
Sum聚合类 - 调用QuerySet的
aggregate()方法做整表聚合求和,代码如下:
# 导入聚合函数 from django.db.models import Sum # 全表统计quantity字段总和,表无数据时返回None total_quantity = ProductInstance.objects.aggregate(quantity_sum=Sum('quantity'))['quantity_sum']
如果需要无存量数据时默认返回0而不是None,可以给Sum加default参数做兜底:
total_quantity = ProductInstance.objects.aggregate( quantity_sum=Sum('quantity', default=0) )['quantity_sum']
扩展:分组求和场景
如果后续需要按关联维度分组统计,比如按仓库统计每个仓库的库存总量,换用annotate()方法即可:
# 按仓库分组,统计每个仓库下所有商品实例的总库存 warehouse_stock = ProductInstance.objects.values('warehouse').annotate( stock_total=Sum('quantity', default=0) )
内容的提问来源于stack exchange,提问作者Damilola Sotomi
相关产品推荐
相关产品推荐

