(Очевидно, я еще недостаточно "кармичен", чтобы оставлять комментарии, или я бы опубликовал это как комментарий, а не как ответ)
Не могли бы вы уточнить, что вы подразумеваете под "ТОЛЬКО кэшированными запросами"?
Кроме того, мне кажется, что ваша проблема может заключаться в том, что вы ударили по своей базе данных много во время рендеринга шаблона.
{% for p in posts %}
--{{p.by.username}} {# 1 #}
--{{p.text}}
{% cache 600 p p.timestamp %}
{% for img in p.images.all %} {# 2 #}
--{{img.path}}
{% endfor %}
{% endcache %}
{% endfor %}
Вы предоставляете "сообщения" в свой шаблон; это один запрос, который, как вы сказали, имеет 100 результатов.
Затем для каждой итерации по сообщениям вы нажимаете на базу данных в {# 1 #}
, чтобы получить p.by, который я предполагаю, что ForeignKey для auth.User.
В дополнение к этому, с неверным кэшем (первый запуск), вы снова нажимаете на db в {# 2 #}
, чтобы получить список изображений этого поста.
Таким образом, для 100 элементов вы попадаете в базу данных 201 раз за запрос на начальный запуск, а 101 - с заполненным кэшем для цикла изображений.
Попробуйте использовать select_related с запросом к сообщениям, чтобы получить эти дополнительные результаты по одному запросу, если это возможно. Что-то вроде posts = Post.objects.select_related('by', 'images').filter(...)
может помочь, хотя я знаю, что select_related
имеет ограничения, когда дело доходит до обращения внешних ключей и полей m2m (это может не сработать для изображений, в зависимости от структуры вашей модели).