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

