我有一个视图,该视图将根据某人选择的字母显示成员(例如,在网页上单击L将显示所有名字以L开头,按姓氏排序的成员)
问题是显示该页面可能需要14秒钟以上的时间(例如“ M”,要列出大约180个成员,大约需要17秒钟)。 SQL查询似乎不是问题,因为“调试工具栏”报告说查询时间不到一秒钟。
这是视图:
def show_all_members(request, letter):
members = MyUsers.objects.filter(firstname__istartswith=letter).order_by('lastname')
alphabet = list(string.ascii_lowercase)
request.session['url'] = request.get_full_path()
context_dict = {'all_members': members, 'alphabet': alphabet}
return render(request, "users/show_all_members.html", context_dict)
编程是一种爱好,所以我对这里发生的事情以及如何对其进行优化感到迷茫。任何帮助和指针,表示赞赏。
使用Django 2.1.1
编辑:这是模板。它显示该成员是否购买了打孔卡或通行证,以及指向其个人资料的链接。
{% extends "base.html" %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Members{% endblock %}
{% block content %}
<div class="container">
<div class="page-header" xmlns="http://www.w3.org/1999/html">
<h2>Tribe members list</h2>
{% for l in alphabet %}
<a href="{% url 'users:show_all_members' l %}" class="btn btn-success">
{{ l }}
</a>
{% endfor %}
</div>
<br>
{% for user in all_members %}
<div class="row">
<p>
<div class="col-md-2">
<a href="{% url 'users:member_info' user.id %}" >
<h7>{{ user.fullname }}</h7>
</a>
</div>
<div class="col-md-1">
<a class="btn btn-warning btn-sm" href="{% url 'users:edit_profile_full' user.id %}"> Edit Profile</a>
</div>
<div class="col-md-6">
<a class="btn btn-success btn-sm" href="{% url 'classes:buy_pass' user.id %}"> Current PC/SP</a>
{%if user.punchcardbyuser_set.all %}
{%for pc in user.punchcardbyuser_set.all %}
<span class="badge badge-primary" >{{ pc.cardclasstype.name }}:{{ pc.classes }}</span>
{%endfor%}
{% endif %}
{%if user.allaccesspassbyuser_set.all %}
{%for aap in user.allaccesspassbyuser_set.all %}
<span class="badge badge-danger">AAP:{{ aap.classes }}</span>
{%endfor%}
{% endif %}
{%if user.seasonpass_set.all %}
/
{%for sp in user.seasonpass_set.all %}
<span class="badge badge-primary">{{ sp.label }}</span>
{%endfor%}
{% endif %}
</div>
<div class="col-md-3">
<a class="btn btn-success btn-sm" href="{% url 'classes:buy_pass' user.id %}"> Buy passes</a>
<a class="btn btn-primary btn-sm" href="{% url 'users:detail' user.username %}">Class attended: {{user.classes_set.all|length}}</a>
</div>
</p>
</div>
{% endfor %}
</div>
{% endblock content %}
答案 0 :(得分:0)
感谢@Willem Van Onsem的技巧,我在Django N + 1上阅读,确实是问题所在。我总共有747个查询...(!)(该页面的确显示了来自不同M2M关系的许多信息。)通过阅读“ prefetch_related”并有些麻烦,它现在降至7,而该页面现在在1.2秒内加载最高我敢肯定,通过学习有关优化查询的更多信息,可以降低它。
members = MyUsers.objects.filter(firstname__istartswith=letter).order_by('lastname').prefetch_related("punchcardbyuser_set").prefetch_related("classes_set").\
prefetch_related("allaccesspassbyuser_set").prefetch_related("seasonpass_set")
谢谢!