Как оптимизировать/закешировать медленные части кода в Django?
Проект написан на Django + Postgres. Построена некая система доступа на основе множества критериев, где простым запросом узнать, имеет ли пользователь доступ куда-то, не получается.
Выполняется цепочка методов, внутри которых имеются так же циклы, которые составляют Q(). К сожалению переписать это сейчас непросто, т.к. на этой система доступа построен весь проект.
Возможно это как-то будет исправляться, но на данный момент решением наверное может быть кеширование.
Возможное решение:
Т.к. на получение "карты доступа" для некоторых пользователей уходит до 30 секунд. Мы подумали, что её карту доступа можно сохранить в кеше (redis) на этапе авторизации пользователем, отправляя параллельно celery-таск. Результат выполнения таска будет сохранен в кеше, к которому можно обратиться после, уже с более быстрым временем выполнения.
Т.к. карта доступа может измениться, при каких-то изменениях можно отправить сигнал на её "переисполнение".
Как считаете, рабочая ли такая идея и какие могут быть подводные камни?
P.S. Запросы по-отдельности дебажились через debug toolbar, и они достаточно быстрые. Проблема в циклах и общем времени выполнения/рендеринга. Индексы у таблиц имеются. К БД претензий нет.
P.S. повторю еще раз, что основные методы, которая в цикле что-то проверяют. делают Q() и т.д. переписать сейчас нельзя.