如何优化以下查询集?
[link.goal for link in self.child_links.all()]
我想摆脱 for 循环并只访问数据库一次。
我有以下代码:
class Goal(models.Model):
name = models.CharField(max_length=300)
progress = models.SmallIntegerField(default=0)
def __str__(self):
return self.name
def calc_progress(self):
progress = 0
subgoals = [link.goal for link in self.child_links.all()]
for subgoal in subgoals:
progress += subgoal.weight * subgoal.progress
weight += subgoal.weight
progress = progress / weight / len(subgoals)
self.progress = int(progress)
class Link(models.Model):
parent_goal = models.ForeignKey(Goal, on_delete=models.CASCADE, related_name="child_links")
goal = models.ForeignKey(Goal, on_delete=models.CASCADE, related_name="parent_links")
weight = models.SmallIntegerField(default=1)
def __str__(self):
return str(self.parent_goal) + "-->" + str(self.goal)
我想摆脱 for 循环并只访问数据库一次。
Well goal
is a ForeignKey
,所以这意味着这是一个传统的N+1问题,您可以通过使用来减少负载.select_related(..)
or .prefetch_related(..)
:
[link.goal for link in self.child_links.select_related('goal').all()]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)