【问题标题】:Django pagination is not working properly with very large datasetDjango 分页在非常大的数据集下无法正常工作
【发布时间】:2019-03-14 11:14:58
【问题描述】:

当我对非常大的数据集使用分页时,它的工作速度太慢了。也许我没有正确实施它。请帮忙。如何让它快速?有什么我可以更改或实施以使其正常工作的吗?

view.py

def display(request):
    user_list = Final.objects.all()
    searchlen= user_list.count()
    paginator = Paginator(user_list, 100)
    page = request.GET.get('page')
    users = paginator.get_page(page)
    return render(request,'displayLogs.html',{'users': users,'searchlen':searchlen})

模型.py

class Final(models.Model):
    name = models.TextField(db_column='Date',primary_key=True, blank=True, null=False)  # Field name made lowercase.
    corr = models.TextField(db_column='CorrelationId', blank=True, null=True)  # Field name made lowercase.

      <tbody>
	<tr class="gradeX">
	{% for item in users %}
	<td>{{item.dat}}</td>
	<td>{{item.act}}</td>
	<td>{{item.actor}}</td>
	<td class="center">{{item.tar}}</td>
	</tr>
							
	{% endfor %}
</tbody>


<div class="pagination" style="border-style:inset;border-width:5px;padding-bottom: 5px">
	{% if users.has_previous %}

	<a class="pagination-action" href="?page=1"> <i class="fas fa-angle-double-left"></i></a>

	<a class="pagination-action" href="?page={{ users.previous_page_number}}"> <i class="fas fa-angle-left"></i></a>

	{% endif %}

	{% for num in users.paginator.page_range %}
		{% if users.number == num %}

			<span class="pagination-number pagination-current"><strong>{{ num }}</strong></span>

		{% elif num > users.number|add:'-3' and num < users.number|add:'3' %}

		<a class="pagination-number" href="?page={{ num }}">{{num}}</a>

		{% endif %}

	{% endfor %}

	{% if users.has_next %}

	<a class="pagination-action" href="?page={{ users.next_page_number }}"><i class="fas fa-angle-right"></i></a>
	<a class="pagination-action" href="?page={{ users.paginator.num_pages }}"> <i class="fas fa-angle-double-right"> </i></a>

	{% endif %}
				
	</div>

【问题讨论】:

  • 你试过调试哪些部分比较慢吗?您是否检查过数据库问题,例如缺少索引?
  • 数据库没有错误
  • 那么缺少索引呢?慢查询日志是否包含相关内容?
  • 我的数据库中有超过 500 万行数据
  • 那么,您确定数据库性能不是问题?

标签: python django django-models django-pagination


【解决方案1】:

我建议为大型数据集做这样的事情。我附上我的设计,如下所示。这里点击&lt;&lt;去第一页,&gt;&gt;去最后一页,&lt;去上一页,&gt;去下一页。

<tbody>
    {% for item in users %}
      <tr class="gradeX">
        <td>{{item.dat}}</td>
        <td>{{item.act}}</td>
        <td>{{item.actor}}</td>
        <td class="center">{{item.tar}}</td>
      </tr>                 
    {% endfor %}
</tbody>
<nav aria-label="pagination" class="pagination_area">
<div class="row">
  {% if users.end_index > 0 %}
  <div class="col-sm-12 col-md-5 d-none d-md-block">
    <p>Showing {{ users.start_index }} to {{ users.end_index }} of {{ users.paginator.count}}.</p>
  </div>
  {% endif %}
  {% if users.paginator.num_pages > 1 %}
  <div class="col-sm-12 col-md-7 dataTables_pager">
    <ul class="pagination">
      {% if users.has_previous %}

        <li class="page-item">
          <a class="page-link" data-page="1" href="?page={{ users.previous_page_number }}">
            <i class="fa fa-angle-double-left"></i>
          </a>
        </li>
        {% if users.previous_page_number > 1 %}
          <li class="page-item">
            <a class="page-link " data-page="{{users.previous_page_number}}"  href="?page={{ users.previous_page_number }}">
              <i class="fa fa-angle-left"></i>
            </a>
          </li>
        {% endif %}

      {% endif %}

      {% if users.previous_page_number > 2 %}
        <li class="page-item">
          <a class="page-link " data-page="{{users.number|add:'-2'}}" href="?{{users.number|add:'-2'}}"> {{ users.number|add:"-2" }} </a>
         </li>
        <li class="page-item">
          <a class="page-link " data-page="{{users.number|add:'-1'}}" href="?page={{users.number|add:'-1'}}"> {{ users.number|add:"-1" }} </a>
        </li>
      {% endif %}

      <li class="page-item active"><span class="page-link ">{{ users.number }}</span></li>

      {% if users.paginator.num_pages > users.number|add:"2" %}
        <li class="page-item">
          <a class="page-link " data-page="{{users.number|add:'1'}}" href="?page={{users.number|add:'1'}}"> {{ users.number|add:"1" }} </a>
        </li>
        <li class="page-item">
          <a class="page-link " data-page="{{users.number|add:'2'}}" href="?page={{users.number|add:'2'}}"> {{ users.number|add:"2" }} </a>
        </li>
      {% endif %}

      {% if users.has_next %}
        <li class="page-item">
          <a class="page-link " data-page="{{users.next_page_number}}" href="?page={{ users.next_page_number }}">
            <i class="fa fa-angle-right"></i>
          </a>
        </li>

        <li class="page-item">
          <a class="page-link " data-page="{{users.paginator.num_pages}}" href="?page={{users.paginator.num_pages}}">
            <i class="fa fa-angle-double-right"></i>
          </a>
        </li>
      {% endif %}
    </ul>
  </div>
  {% endif %}
</div>
</nav>

这是我的设计。您可以根据需要更改设计。

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2018-11-05
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2013-12-14
    • 2014-09-21
    • 2013-08-22
    • 2012-09-25
    相关资源
    最近更新 更多