Зависит, потому что есть одно большое ограничение от СУБД (которое затрагивает все базы данных, включая MySQL, Postgres и т. Д.).
django.core.paginator
принимает QuerySet
, представляющий любой тип SQL-запроса, и добавляет предложение LIMIT
, чтобы просто получить пару записей из базы данных. Этот подход хорошо работает для многих видов приложений, но может стать серьезной проблемой, если у вас много записей. Особая проблема заключается в том, что всякий раз, когда вы обращаетесь к 800-й странице, база данных фактически извлекает 801 * 20 записей, а затем снова отбрасывает первые 800 * 20 записей, чтобы вернуть последние двадцать.
К сожалению, нет простого способа решить эту проблему. Во многих случаях кнопки «следующий / предыдущий» может быть достаточно, чтобы вы могли написать свою собственную нумерацию страниц, которая работает с дополнительными клавишами вместо номеров страниц. Например, если последняя запись, отображаемая в данный момент пользователем, имеет ключ "D"
, вы показываете следующую кнопку, которая ссылается на /next?after=D
, а затем используете запрос SQL, например SELECT * FROM objects WHERE key >
D ORDER BY key LIMIT 20
. Преимущество этого подхода в том, что вы можете добавить индекс на objects.key
, который значительно ускорит процесс.
Другой подход требует добавления дополнительного индексированного (!) Столбца page_num
к вашей таблице. Затем вы можете выполнять SQL-запросы, такие как SELECT * FROM objects WHERE page_num=800 ORDER BY key
. При таком подходе вы все равно можете получить доступ ко всем страницам случайным образом, но вы должны поддерживать столбец page_num. Это может быть легко, если данные в основном добавляются в конце, и сложнее, если вы хотите эффективно удалять / вставлять элементы из середины.
Итак, я бы начал с django.core.paginator
, потому что это всего лишь 1 строка кода. Но следите за временем отклика ваших разбитых на страницы представлений и журнала медленных запросов из вашей базы данных. Если ваш сервер базы данных больше не может справиться с нагрузкой, вам придется выбрать один из методов, упомянутых выше. Выберите решение 2, если требуется произвольный доступ к странице, и решение 1 в противном случае (поскольку это намного проще).
PS: И да, django.core.paginator
будет работать правильно. :)