使用modelformset_factory保存请求POST时的性能问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用modelformset_factory保存请求POST时的性能问题相关的知识,希望对你有一定的参考价值。

我正在一个项目中,我需要每页显示与特定模型相关的50个表格。我使用modelformset_factory一次显示和编辑多个实例,但是在保存大约50条记录(50种形式的相同模型)时遇到性能问题。为了保存数据,它进行了350多个查询,我使用了django-debug-toolbar。检查性能,不幸的是每个记录/表单都会进行多个查询。

click to view the result from django-debug-toolbar

这是views.py的代码段:

def offerScoring(request, offid, page):
    formset = modelformset_factory(Enroll, extra=0, form=Scoring)
    if request.POST:
        form = formset(data=request.POST)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.INFO,
                                 "Scores are saved updated successfully")
            return redirect(reverse('offerScoring', kwargs='offid': offid, 'page': page))
        else:
            messages.add_message(request, messages.INFO,
                                 "Scores were NOT updated ")

    AllEnrolled = Enroll.objects.select_related('StudentID','OfferingID','OfferingID__Course').filter(OfferingID=offid)
    paginator = Paginator(AllEnrolled, 50)
    Enrolled = paginator.get_page(page)
    Enrolled.ordered = True

    if request.method == "GET":
        form = formset(queryset=Enrolled)

    return render(request, template_name='Course/templates/offerScoring.html',
                  context='form': form, 'Enrolled': Enrolled)

关于提交表单时如何减少查询数量的任何想法?

答案

发生这种情况是由于您与外键的关系。它将首先查询对象,然后查询它们的相关对象。您应该可以使用prefetch_related解决问题:

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#prefetch-related

以上是关于使用modelformset_factory保存请求POST时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

在基于 Django 类的视图中使用 modelformset_factory

元类与 Django 中的 modelformset_factory 冲突

默认情况下选择第一张图片作为 modelformset_factory 的特色

Django formset_factory vs modelformset_factory vs inlineformset_factory

Django补充

'Page'对象没有属性'ordered'异常