Django遍历表单批量保存多个Student对象时仅最后一条生效如何解决?
问题根因
你全程只复用了同一个Student实例:通过form.save(commit=False)仅生成了1个未保存的实例对象,第一次调用save()后该实例就被绑定了数据库主键,后续循环中修改属性再调用save(),都是对同一条记录执行更新操作,因此最终数据库中只会保留最后一次循环修改的结果。
修复方案
每次循环时都新建独立的Student实例即可,同时补充空行校验避免输入换行异常导致报错,修改后的视图代码如下:
def addmultistudent(request, classroom_id): classblock = Classroom.objects.get(id=classroom_id) if request.method == 'POST': form = MultiStudentForm(request.POST) if form.is_valid(): # 仅从表单取出批量输入的内容,不复用单实例 multi_input = form.cleaned_data['multistudentinput'] student_list = multi_input.split('\n') for line in student_list: line = line.strip() # 跳过空行避免报错 if not line: continue all_names = line.split() if len(all_names) < 1: continue # 每次循环新建独立的Student实例 student = Student() student.classroom = classblock student.student_first = all_names[0] if len(all_names) == 2: student.student_last = all_names[1] student.nickname = all_names[0] + all_names[1][:1] else: student.student_last = '' student.nickname = all_names[0] # 可选:如果不需要给每个学生存储全量批量输入内容,可清空该字段 # student.multistudentinput = '' student.save() form = MultiStudentForm(None) context = {'form': form} return render(request, "gradebook/addmultistudent.html", context) else: context = {'form': form} return render(request, "gradebook/addmultistudent.html", context) else: form = MultiStudentForm(None) context = {'form': form} return render(request, "gradebook/addmultistudent.html", context)
可选优化
如果不需要触发Student模型的自定义save逻辑、字段信号等,可把所有新实例先存入列表,最后调用Student.objects.bulk_create(实例列表)一次性插入所有数据,大幅提升批量插入的性能。
内容的提问来源于stack exchange,提问作者Doug Smith
相关产品推荐
相关产品推荐

