0

我的 django 视图中有一个来自 core.serializers 的序列化程序。它确实有效,但有时需要超过 1 分钟才能显示我的结果表。任何想法如何更快地获得它?

# views.py 
from django.core import serializers

def search_institution(request):
    form = SearchInstitutionsForm()
    qs = Institution.objects.all()
    if request.method == "POST":
        form = SearchInstitutionsForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            if cd['name']:
                qs = Institution.objects.filter(name__contains=cd['name'])
            print(f"Before requesting from db: {datetime.now()}")
            print(f"After requesting from db, before serializing: {datetime.now()}")
        context = {
            "result_data": SafeString(serializers.serialize("json", qs)),
            'form': form
        }
        print(f"After serializing, before rendering: {datetime.now()}")
        return render(request, "landing/result_table.html", context)
    else:

        context = {
            "form": SearchInstitutionsForm
        }
        return render(request, "stakeholders/institution_form.html", context)

4

1 回答 1

0

您的打印语句没有多大帮助,因为Querysets 是惰性的。这意味着它们不会在过滤时进行评估,qs = Institution.objects.filter(name__contains=cd['name'])而是在使用实际值时进行评估。

所以我不会过多地介绍序列化,有很多很好的方法可以做到这一点,而 Django 本身已经提供了很好的工具。查看 Queryset 和数据库性能,这是最重要的主题,我怀疑您的性能问题来自哪里。还要对 select_related 和 prefetch_related 做更多的研究,它将帮助您将 200 多个查询减少到 2 个

您可以在本地环境中使用django Debug 工具栏轻松监控您的应用程序。但也有其他分析工具和技巧。

于 2021-08-19T07:36:45.683 回答