Как сократить циклы for в html в Django?
Я попробовал следующие циклы for и операторы if в django html, но загрузка одной страницы занимает очень много времени. Во-первых, вот html:
А вот мой get_context_data
для моего общего представления списка:
Я думаю, это происходит потому, что у меня слишком много циклов for и операторов if в моем html. Могу ли я как-то увеличить скорость? Или есть ли способ сделать то же самое в представлениях django (я использую общий вид списка, поэтому мне нужен некоторый код для get_context_data
)? Спасибо, и пожалуйста, оставляйте любые вопросы, которые у вас могут возникнуть.
Трудно сказать, где в вашем коде проблема с производительностью. Циклы в html не должны занимать много времени. Возможно, у вас много запросов к базе данных или вы запускаете какие-то тяжелые методы.
Попробуйте выяснить, какая часть вашего кода действительно медленная. Для этого вы можете использовать Silk profiler
Silk - это инструмент профилирования и проверки в реальном времени для фреймворка Django. Silk перехватывает и сохраняет HTTP запросы и запросы к базе данных перед тем, как представить их в пользовательском интерфейсе для дальнейшей проверки:
Установка
pip install django-silk
В settings.py
добавьте следующее:
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
INSTALLED_APPS = (
...
'silk'
)
Попробуйте найти метод, который занимает большую часть времени, и оптимизируйте его. Также вы можете добавить результат Silk к вашему вопросу. Это поможет разобраться в проблеме
Всегда лучше уменьшить количество обращений к базе данных. В вашем коде вы обращаетесь к базе данных на итерации, поэтому если цикл выполняется 1000 раз, он обратится к базе данных 1000 раз. Это можно сократить до одного запроса следующим образом:
classes = Class.objects.filter(
teacher=teacher, date__in=[each_date for each_date in dates_in_month
if each_date not in weekends]
).order_by('date','time')
тогда вы можете итерировать набор запросов classes
, чтобы продолжить работу с остальной частью кода.
Также сделайте ваш код более читабельным, сейчас он грязный.