预取Django模型属性

时间:2018-07-03 17:13:06

标签: python django django-models django-rest-framework django-queryset

优化模型属性的预取时遇到问题。但是让我们先从代码开始,这样可以更轻松地解释我的问题:

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 :(得分:0)

实际上,我可以使用SELECT COUNT(*)中的@cached_property而不是django.utils.functional来阻止@property查询

这将缓存相关属性,并且不会进行不必要的数据库查询。 与正常的teams预取配对,我的性能现在得到了极大的改善。