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

