优化 Django Queryset for 循环

2024-05-27

如何优化以下查询集?

[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(使用前将#替换为@)

优化 Django Queryset for 循环 的相关文章

随机推荐