Как сократить циклы 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, чтобы продолжить работу с остальной частью кода.

Также сделайте ваш код более читабельным, сейчас он грязный.

Вернуться на верх