Django模型不会使用.update()更新

时间:2019-08-16 15:45:58

标签: python django

我正在尝试使用Model.objects.update(** kwargs)使用网站前端提供的信息来更新数据库中的记录,但是在运行代码时出现以下错误:

“具有此ID的“记录”已存在。”

我曾希望使用“ update”方法而不是“ create”方法将意味着这无关紧要/应该已经存在具有相同ID的记录。

def find_patient(request):
    my_form = ExampleForm()
    if request.method == "POST":
        my_form = ExampleForm(request.POST)
        if my_form.is_valid():
            UserInfo.objects.update(**my_form.cleaned_data)
        else:
            print(my_form.errors)
    context = {
        'form': my_form,
        'data_input': DataInput.objects,
        'sections': SECTION_CHOICES
    }
    return render(request, 'example.html', context)

产生的错误看起来像这样:

  • id
  • 具有该ID的用户信息已存在。

  • 我是否误解了“更新”的用例,如果是这样,我将如何使用kwargs更新数据库中给定记录的所有字段?

    1 个答案:

    答案 0 :(得分:2)

    您的UserInfo.objects.update(**my_form.cleaned_data)旨在更新数据库中的所有记录。由于您的表单包含主键(id),因此它将旨在将所有记录的id更新为给定值。但是,由于这些值应该是唯一的,因此这当然会引发错误。

    您可以通过在更新之前进行过滤来防止这种情况发生,例如:

    UserInfo.objects.filter(
        pk=my_form.cleaned_data['id']
    ).update(**my_form.cleaned_data)

    但是更新特定记录通常以不同的方式进行:您通常在URL中传递主键。因此urls.py看起来像:

    # app/urls.py
    
    from django.urls import path
    from app.views import find_patient
    
    urlpatterns = [
        # ...
        path('updatepatient/<int:pk>/', views.find_patient),
        # ...
    ]

    然后在视图中,我们可以传递项目以更新为表单:

    # app/views.py
    
    from django.shortcuts import get_object_or_404, redirect
    
    def find_patient(request, pk):
        instance = get_object_or_404(UserInfo, pk=pk)
        if request.method == "POST":
            my_form = ExampleForm(request.POST, instance=instance)
            if my_form.is_valid():
                my_form.save()
                return redirect('some-view-name')
        else:
            my_form = ExampleForm()
        context = {
            'form': my_form,
            'data_input': DataInput.objects.all(),
            'sections': SECTION_CHOICES
        }
        return render(request, 'example.html', context)

    在POST请求成功的情况下,通常会重定向到页面。这是众所周知的Post/Redirect/Get pattern [wiki]