优化模型属性的预取时遇到问题。但是让我们先从代码开始,这样可以更轻松地解释我的问题:
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')
这个想法甚至可行吗,或者我该如何优化/做到这一点?
答案 0 :(得分:0)
实际上,我可以使用SELECT COUNT(*)
中的@cached_property
而不是django.utils.functional
来阻止@property
查询
这将缓存相关属性,并且不会进行不必要的数据库查询。
与正常的teams
预取配对,我的性能现在得到了极大的改善。