Как реализовать paginator, который не вызывает count (*) - PullRequest
10 голосов
/ 10 октября 2011

Я работаю над сайтом django, который имеет внутреннюю базу данных MySQL innodb. У нас есть сотни тысяч записей в нескольких наших таблицах, и это вызывает некоторые проблемы со стабильностью / производительностью сайта у администратора. В частности, django любит делать запросы count (*) при создании страниц, и это вызывает много проблем.

С Django 1.3.x они начали предоставлять собственные классы нумерации страниц. Поэтому я заинтересован в том, чтобы найти способ ускорить или устранить эти запросы. До сих пор я просматривал эти две страницы: http://code.google.com/p/django-pagination/source/browse/trunk/pagination/paginator.py https://gist.github.com/1094682 и на самом деле не нашел их, что я ищу. Любые предложения, помощь, т. Д. будет высоко ценится.

Ответы [ 2 ]

10 голосов
/ 03 ноября 2011

Вы можете определить переменную _count в своем пагинаторе

  paginator = Paginator(QuerySet, 300)
  paginator._count = 9000 # or use some query here

А вот часть кода django paginator, чтобы помочь вам понять, что делает эта переменная и как работает счетчик страниц

def _get_count(self):
    "Returns the total number of objects, across all pages."
    if self._count is None:
        try:
            self._count = self.object_list.count()
        except (AttributeError, TypeError):
            # AttributeError if object_list has no count() method.
            # TypeError if object_list.count() requires arguments
            # (i.e. is of type list).
            self._count = len(self.object_list)
    return self._count
count = property(_get_count)
0 голосов
/ 22 января 2012

Вы также можете проверить django-endless-pagination . endless_pagination.paginator.LazyPaginator неплохо, но вам может потребоваться добавить несколько настроек.

...