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

如何在Django中筛选金额累计小于指定值的行?

解决Django中筛选累计总和小于指定值的行

问题原因

你之前的代码statics.objects.annotate(total=Sum('amount')).filter(total__lte=55)无效的核心原因是:未指定求和的范围。默认情况下,Sum('amount')会对每个单独的statics对象单独求和,所以每行的total只会等于自身的amount值,完全达不到累计求和的效果。

解决方案

要实现累计求和并筛选,需要用Django的窗口函数(Window),先按指定顺序(这里假设按id升序,可根据实际需求调整)计算从第一行到当前行的累计金额,再筛选累计总和小于等于55的行。

步骤1:导入所需模块

from django.db.models import Sum, Window, F

步骤2:编写查询语句

data = statics.objects.annotate(
    cumulative_total=Sum('amount', window=Window(order_by=F('id').asc()))
).filter(cumulative_total__lte=55)

代码说明

  • Window(order_by=F('id').asc()):定义累计求和的窗口范围,按id从小到大排序,保证累计是按数据顺序依次累加。
  • Sum('amount', window=...):在指定窗口内对amount做累计求和,每行的cumulative_total就是从第一行到当前行的金额总和。
  • filter(cumulative_total__lte=55):筛选出累计总和≤55的行,正好匹配你预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:17:13