我正在将updating
上的QueryDict
和django一起使用到数据库中。此QueryDict
来自request.POST
方法的html
接口。
<QueryDict: {'csrfmiddlewaretoken': ['foo'], 'student_attend': ['Select', 'Select', 'Select'], 'final_student_pk': ['7', '8', '12'], 'submit_student_attendance': ['']}>
我试图做的是基于database object
值更新student_attend
final_student_pk
列。意思是说,我正在尝试以下操作:
if 'submit_student_attendance' in request.POST:
to_update = AddNewSchedule.objects.filter(pk=request.POST['final_student_pk'])
to_update.update(student_attend=request.POST['student_attend'])
这确实完成了更新我的AddNewSchedule
数据库表的工作。但是,它仅更新最后一个pk
项。 (即:它仅更新数据库中的项目12)。它也不会循环通过pk 7
和pk8
来更新数据库。
我该如何解决?
答案 0 :(得分:0)
您无法在一个查询中执行此操作,因为每个实例的值都是唯一的。尝试遍历实例并一次更新一个实例。您可以使用transaction.atomic
来减少数据库开销。
if 'submit_student_attendance' in request.POST:
id_list = request.POST.getlist('final_student_pk')
instance_list = request.POST.getlist('student_attend')
with transaction.atomic():
for instance, id in zip(instance_list, id_list):
to_update = to_update = AddNewSchedule.objects.filter(pk=id)
to_update.update(student_attend=instance)
有关更多详细信息,请参见此answer。
答案 1 :(得分:0)
结果证明答案很简单。我要做的就是使用getlist
。我在这里做了参考:https://kite.com/python/docs/django.http.request.QueryDict。
if 'submit_student_attendance' in request.POST:
print(request.POST.getlist('student_attend'), request.POST.getlist('final_student_pk'))
from django.db import transaction
for key, value in zip(request.POST.getlist('final_student_pk'), request.POST.getlist('student_attend')):
with transaction.atomic():
to_update = AddNewSchedule.objects.filter(pk=key)
to_update.update(student_attend=value)