Как кэшировать QuerySet в Django
Я начинаю работу над своим веб-приложением на Django. Я попытался сделать некоторую оптимизацию и посмотреть на запросы и время загрузки. Я сделал несколько рефакторов с помощью select_related или prefetch_related, но я получил стек.
У меня есть несколько структурированных рейтингов в соответствии с объектом, которому они присвоены. Мне нужно на каждом уровне структуры (сотрудник, команда, компания...) произвести некоторые вычисления с данными рейтингов. Я создал метод класса в каждой модели и отфильтровал соответствующие рейтинги в соответствии с объектом, которому он принадлежит.
def get_ratings(self):
employee_projects = EmployeeManagement.objects.filter(employee=self)
feedbacks = Feedback.objects.filter(rate_for__in=employee_projects)
ratings = Rating.objects.filter(feedback__in=feedbacks)
return ratings
Я использую данные из этого метода во многих местах как входные данные для вычислений, как свойство в модели. Но проблема в том, что каждый раз, когда я вызываю этот метод, создается запрос в DB. Я думаю, что мне понадобится какой-то кэш, но когда я попытался украсить его как свойство, возникло исключение : 'QuerySet' object is not callable.
Следующий вопрос, который у меня возник, связан с количеством экземпляров одного и того же объекта. Каждый экземпляр имеет уникальные значения и место в структуре и возвращаемые рейтинги разные, но это не возможно при большом количестве экземпляров, делая запрос для каждого из них.
Когда у меня есть 10 экземпляров объекта и объект имеет 10 использований метода get_rating, в БД будет 10x10 запросов.
Есть ли какой-нибудь хороший подход для решения такого рода проблем с производительностью? Я буду благодарен за любой совет. Большое спасибо.