使用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