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

Django批量更新数据时报'int' object has no attribute 'save'错误如何解决?

错误根源
  • 直接原因:Django ORM的QuerySet.update()方法返回值是本次操作影响的记录行数(整数类型),不是模型实例,你对整数调用save()方法自然触发'int' object has no attribute 'save'报错。而且update()方法执行后已经直接把修改写入数据库,不需要额外调用save()。
  • 次要原因:原代码存在缩进错误,if request.method == 'POST'后的逻辑没有正确缩进,导致POST请求触发的执行流程异常,这也是你只更新了1行数据的原因之一。
  • 补充注意:原代码中date、invoice两个变量未给出定义逻辑,修复时要确保这两个变量在执行更新前已经正确赋值,否则会触发变量未定义报错。
修复方案

方案1:最简修改(保留原有循环逻辑)

删掉错误的save()调用,修正代码缩进即可:

def saleForm(request):
    stb = []
    if request.method == 'POST':
        # 修正缩进,POST逻辑全部纳入if判断范围内
        for stb_array in request.POST.getlist('stb_sl'):
            stb.append(stb_array)
        i = 0
        for stb_ho in stb:
            # update执行后无需调用save
            StpDetails.objects.filter(stp_sl=stb_ho).update(
                sale_date=date,
                sales_invoice=invoice,
                status='Sold'
            )
            i += 1
        messages.success(request, '数据保存成功')
    return render(request,'sale/invoice_details.html',{})

方案2:更高效的批量更新(推荐)

不需要循环遍历,直接用__in条件一次性过滤所有需要更新的记录,单次数据库操作即可完成批量更新,性能更高:

def saleForm(request):
    if request.method == 'POST':
        # 直接获取所有要更新的stp_sl编号列表
        stb_list = request.POST.getlist('stb_sl')
        # 批量更新所有匹配记录
        updated_count = StpDetails.objects.filter(stp_sl__in=stb_list).update(
            sale_date=date,
            sales_invoice=invoice,
            status='Sold'
        )
        messages.success(request, f'成功更新{updated_count}条数据')
    return render(request,'sale/invoice_details.html',{})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:57:02