Django操作MySQL出现'QuerySet' object has no attribute 'save'报错如何解决
报错根因
- 你在
add视图中使用TL.objects.all()拿到的是查询集(QuerySet)对象,代表TL表的所有记录集合,该对象没有save()方法,只有单个Django模型实例才支持save()操作,这是触发报错的直接原因。 - 现有逻辑存在功能偏差:你当前要实现的是新增TL记录的需求,不应该直接操作全表查询集,而是要创建新的TL模型实例完成写入。
修正方案
1. 修正views.py中的add函数逻辑
def add(request): ad = TL.objects.all() if request.method == 'POST': # 从POST请求取表单参数 TL_Name = request.POST.get('TL_Name') Proj_name = request.POST.get('Proj_name') Deadline = request.POST.get('Deadline') # 新建TL模型实例 new_tl_item = TL() # 给实例属性赋值 new_tl_item.TL_Name = TL_Name new_tl_item.Proj_name = Proj_name new_tl_item.Deadline = Deadline # 若你的TL模型中Proj_Status字段无默认值,此处需补充赋值,示例: # new_tl_item.Proj_Status = "待审核" # 保存实例到数据库 new_tl_item.save() return redirect("/operations") # 修正模板传参:新增场景下b变量不需要传查询集,传None即可避免表单异常 return render(request, 'operations.html', {"name": ad, 'b': None})
2. 可选优化模板(避免新增表单默认值异常)
你当前operations.html中新增表单的input默认值绑定了{{b.TL_Name}},如果后续有其他场景需要传b变量的话,可以把新增表单的input的value属性清空,改为:
<input type="text" name="TL_Name" value="">
扩展说明
如果你后续需要对批量记录做更新操作,可以使用QuerySet自带的update()方法,不需要调用save(),示例:
# 将所有TL记录的Deadline更新为2024-12-31 TL.objects.all().update(Deadline="2024-12-31")
内容的提问来源于stack exchange,提问作者Vijayalakshmi Ramesh
相关产品推荐
相关产品推荐

