【问题标题】:how to update django database entry based on request.POST data如何根据 request.POST 数据更新 django 数据库条目
【发布时间】:2018-11-13 03:10:48
【问题描述】:

我正在使用 django 将 updating 我的 QueryDict 导入数据库。这个QueryDict 来自通过html 接口的request.POST 方法。

<QueryDict: {'csrfmiddlewaretoken': ['foo'], 'student_attend': ['Select', 'Select', 'Select'], 'final_student_pk': ['7', '8', '12'], 'submit_student_attendance': ['']}>

我试图做的是根据final_student_pk 值更新我的database object student_attend 列。意思是说,我正在尝试以下操作:

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 来更新数据库。

我该如何解决这个问题?

【问题讨论】:

    标签: python django


    【解决方案1】:

    原来答案很简单。我所要做的就是使用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)
    

    【讨论】:

      【解决方案2】:

      您不能在一个查询中执行此操作,因为每个实例的值都是唯一的。尝试遍历实例并一次更新一个。您可以使用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 = AddNewSchedule.objects.filter(pk=id)
                  to_update.update(student_attend=instance)
      

      查看answer了解更多详情。

      【讨论】:

      • 您好,感谢您的回答。但这似乎并不能解决问题。它仍然没有更新所有条目的数据库。
      • 哦。我犯了一个错误。应该是getlist()
      • 更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2021-11-11
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多