Как кэшировать 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 запросов.

Есть ли какой-нибудь хороший подход для решения такого рода проблем с производительностью? Я буду благодарен за любой совет. Большое спасибо.

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