Django нумерация больших изображений - PullRequest
0 голосов
/ 09 мая 2011

У меня есть пара сотен миниатюр изображений по 15 КБ каждая. Я хочу отображать 20 или около того на каждой странице.

Достаточно ли django.core.paginator для нумерации страниц? Т.е. будут ли возвращаться только те изображения, которые отображаются на текущей странице? (А если нет, то какой будет хороший способ сделать это?) Спасибо.

1 Ответ

1 голос
/ 09 мая 2011

Зависит, потому что есть одно большое ограничение от СУБД (которое затрагивает все базы данных, включая 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 будет работать правильно. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...