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

Django+PostgreSQL实现往来台账balance字段按日期查询累计求和问题

问题原因

  • 类型不兼容报错:你初始化cumbalance = 0.00是float类型,和模型里balance的Decimal类型运算时类型不匹配,所以报unsupported operand type(s) for +=错误。
  • 逐行累计需求不满足:原有逻辑只计算了整个查询范围的总累计值,没有给每行记录对应存储截至当前行的累计余额,同时前端双重循环的逻辑错误,会导致数据重复渲染。

解决方案

第一步:修改views.py代码

from decimal import Decimal # 确保已导入Decimal模块

def partyDetails(request,pk):
    form = DateRangeForm()
    search = []
    current_cum = Decimal('0.00')
    if request.method == 'POST':
        form = DateRangeForm(request.POST)
        if form.is_valid():
            # 按日期升序排序,保证累计顺序正确
            search = PurchasePayment.objects.filter(
                vendor=pk,
                date__range=(
                    form.cleaned_data['start_date'],
                    form.cleaned_data['end_date']
                )
            ).order_by('date')
            # 遍历每条记录,给每条添加当前累计余额的自定义属性
            for item in search:
                current_cum += item.balance 
                item.cum_balance = current_cum
    else:
        return redirect('party_ledger')
    return render(request, 'purchase/party_details.html', {
        'dateform':form, 
        'party':search,
        'name':pk,
        'total_cumbalance':current_cum # 若需要页面单独展示整个区间总累计可传该参数
    })

第二步:修改前端HTML模板代码

去掉多余的内层循环,直接调用每条记录绑定的累计余额属性即可:

<tbody>
    {% for data in party %}
    <tr>
        <td >{{data.date}}</td>
        <td >{{data.invoice}}</td>
        <td >{{data.amount}}</td>
        <td >{{data.discount}}</td>
        <td >{{data.payment}}</td>
        <td >{{data.cum_balance}}</td>                               
    </tr>
    {% endfor %}
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:06:03