Django нумерация страниц работает очень медленно, когда набор данных слишком велик - PullRequest
0 голосов
/ 15 марта 2019

Django Pagination очень медленная, когда набор данных очень большой (> 100k) мой набор данных состоит из 80 столбцов и более 100 тыс. строк. когда я загружаю страницу или меняю страницу, это занимает 14-15 секунд Есть ли что-нибудь, что я могу сделать, чтобы сделать это быстро
что я могу сделать, чтобы сделать это быстро. пожалуйста, помогите с этим

model.py

class Finaltest3(models.Model):
a = models.DateTimeField(db_column='Dat',primary_key=True, blank=True, null=False)  # Field name made lowercase.
b = models.TextField(db_column='C', blank=True, null=True)  # Field name made lowercase.
c = models.TextField(db_column='S', blank=True, null=True)  # Field name made lowercase.
d = models.TextField(db_column='Ca', blank=True, null=True)  # Field name made lowercase.
e = models.TextField(db_column='Ac', blank=True, null=True)  # Field name made lowercase.
f = models.TextField(db_column='Re', blank=True, null=True)  # Field name made lowercase.
 .
 .
 .
 .
 .
fd = models.TextField(db_column='Add', blank=True, null=True)  # Field name made lowercase.
fd= models.TextField(db_column='Addit', blank=True, null=True)  # Field name made lowercase.
fd = models.TextField(db_column='Additional', blank=True, null=True)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'finaltest3'

view.py

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import datetime
from datetime import date
from datetime import timedelta
from django.http import HttpResponseRedirect
from django.shortcuts import render
def displayLogs(request):
  today = date.today() 
  lastweek=today - timedelta(days=7)
  print('lastweek',lastweek)    
  user_list = Finaltest3.objects.filter(dat__gt=lastweek)
  paginator = Paginator(user_list, 10)
  page = request.GET.get('page')
  users = paginator.get_page(page)
return render(request,'displayLogs.html',{'users':users})

template.html

<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>
<tbody>
                        <tr class="gradeX">
                            {% for item in users %}
                                <td>{{item.dat}}</td>
                                <td>{{item.act}}</td>
                                <td>{{item.actor}}</td>
                                <td class="center">{{item.target}}</td>
                            </tr>

                        {% endfor %}
</tbody>

1 Ответ

1 голос
/ 15 марта 2019

Я думаю, что медлительность вызвана следующим:

  • Вероятно, нет индекса базы данных в поле, которое вы фильтруете - используемая система БД должна отсортировать все данные для lastweek фильтрация полей
  • Помните, что вы можете напечатать запрос, сгенерированный Django: print(Finaltest3.objects.filter(dat__gt=lastweek).query).
  • Вы выбираете все столбцы для данных, возможно, вы можете ограничить поля теми, которые вам нужны - посмотрите только на и отложите
...