Django-显示用户列表需要14秒钟以上的时间,如何加快速度?

时间:2018-09-16 17:54:29

标签: django django-views

我有一个视图,该视图将根据某人选择的字母显示成员(例如,在网页上单击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 %}

1 个答案:

答案 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")

谢谢!