如何基于request.POST数据更新Django数据库条目

时间:2018-11-13 03:10:48

标签: python django

我正在将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 7pk8来更新数据库。

我该如何解决?

2 个答案:

答案 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)