Django循环插入Model数据异常:仅插入1条,求技术解决方案
问题分析与解决方案
你遇到的问题很典型——你一直在修改并保存同一个Employee实例,而不是每次循环创建新的实例。
看你的代码:self.object = form.save(commit=False)只生成了一个Employee对象,之后的循环里你只是不断修改这个对象的name和no属性,然后调用save()。但Django模型的save()方法,当对象已经有主键(也就是已经被保存过一次)时,会执行更新操作,而不是插入新记录。所以最后你看到的只是最后一次循环修改后的那条数据。
修正后的代码示例
方案1:仅插入循环生成的5条数据(不保留表单提交的原始对象)
class EmpCreateView(CreateView): fields = () model = models.Employee def form_valid(self, form): loopdo = 5 while loopdo > 0: # 每次循环都创建一个全新的Employee实例 new_emp = models.Employee() new_emp.name = "work?" new_emp.no = loopdo new_emp.save() # 这里会插入新的数据库记录 loopdo -= 1 # 重定向到你需要的页面,比如员工列表页 return redirect('employee-list') # 替换成你的实际URL名称
方案2:同时保存表单提交的原始对象 + 循环生成的5条数据
如果你需要保留表单提交的原始数据,再额外插入循环的记录,可以这样写:
class EmpCreateView(CreateView): fields = () model = models.Employee def form_valid(self, form): # 先保存表单对应的原始对象 self.object = form.save() loopdo = 5 while loopdo > 0: # 基于原始对象复制字段(如果需要的话),再修改循环字段 new_emp = models.Employee( name=self.object.name, # 这里可以换成固定值"work?",看你的需求 no=loopdo # 其他需要复制的字段都可以在这里添加 ) new_emp.save() loopdo -= 1 # 调用父类的方法完成后续流程(比如重定向到详情页) return super().form_valid(form)
关键知识点
- Django模型实例的
save()方法:如果实例没有主键(从未保存过),执行插入;如果已有主键,执行更新。 - 要插入多条记录,必须为每条记录创建新的模型实例,不能复用同一个实例修改后保存。
内容的提问来源于stack exchange,提问作者Dicky Raambo
相关产品推荐
相关产品推荐

