Предварительная выборка для свойств модели Django - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с оптимизацией предварительной выборки свойств модели. Но давайте сначала начнем с кода, который облегчает объяснение моей проблемы:

class Tournament(models.Model):
    name = models.CharField(...)

    @property
    def active_teams(self):
        return self.teams.exclude(state=TeamStateTypes.inactive)

    @property
    def total_count_teams(self):
        return self.active_teams.count()


class Team(models.Model):
    tournament = models.ForeignKey(
        Tournament, ...
        related_name='teams'
    )

Моя проблема в том, что у меня есть несколько таких counts, как total_count_teams. Когда запрос получает Tournament, это приводит ко многим запросам SQL, что делает его медленным.

Чтобы повысить производительность, я попытался prefetch, но запросы SELECT COUNT(*) все еще сохраняются.

Tournament.objects.all().prefetch_related('teams')

Эта идея вообще осуществима или как мне оптимизировать / сделать это?

1 Ответ

0 голосов
/ 04 июля 2018

Я действительно смог предотвратить запросы SELECT COUNT(*), используя @cached_property из django.utils.functional вместо @property

Это кэширует соответствующие свойства и не делает ненужных запросов к базе данных. В сочетании с обычной предварительной загрузкой teams моя производительность теперь значительно улучшена.

...