如何在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
相关产品推荐
相关产品推荐

