Где и как оптимальнее всего хранить массивы данных, необходимых на значительном количестве страниц в django-проекте?

Написал свой первый более-менее значительный проект на django (не в коммерческих целях, а как этап обучения). Есть некоторые моменты, реализация которых мне не нравится. Проект - магазин, в базе данных которого может быть 100, 1000 или вообще неизвестное число товаров. Кроме того, есть категории, такие как Новинки, Лидеры продаж, Бестселлеры, Лидеры просмотров, Лидеры рейтинга ( могут быть иные), в которые попадает ограниченное число товаров по определенному признаку. Количество товаров в этих категориях указывается в настройках проекта. Сами по себе эти "категории" не хранятся в бд, а являются результатами запросов по сроку публикации/количеству продаж товара/количеству просмотра страницы с товаром/рейтингу, что хранится во вспомогательных таблицах бд проекта. Доступ к этим категориям нужен где-то в половине страниц, а иногда в двух/трех фрагментах страниц, которые вроде как рендерятся независимо друг от друга. Иногда данные нужны, чтобы добавить метку на фото товара (что он бестселлер, лидер просмотра, новинка и т.п), а иногда нужно полноценно в виде вывести список или его часть в меню навигации, какой-нибудь баннер или везде одновременно. Встал вопрос, в каком виде тягать за собой эти данные (их условно считаем более-менее постоянными / не изменяемыми в течение сессии пользователя):

  1. Добавить id в cookies или session {'new_arrivals': [1, 4, 6..], 'bestsellers': [4, 34, 789..]}. Потом по месту проверять вхождение товара в список для метки или геттить все айди для баннера/меню.
  2. Сделать middleware, который или с каждым запросом упорно лезет в бд, делает запросы и закидывает или списки товаров, или их id в контекст.
  3. Сделать simle-tag'и, которые запускаются уже в нужных фрагментах страниц для получения или id, или списка/части списка нужной категории. Пока реализовано именно так, но решительно не нравится. Хотя бы потому, что один фрагмент страницы или баннер может не знать, что другой уже это сделал. А проверять есть ли уже нужные данные в контексте - выглядит костылево. Да и контекст раздувается.
  4. Завести какой-нибудь storage для этих данных. Есть еще что-нибудь и что вообще используется в жизни, а что "принято" использовать для демонстрационного проекта, чтобы выглядело грамотно? Подскажите пожалуйста.
Вернуться на верх