3

我有两个实体,即 Project 和 Issue,定义如下:

class Project(models.Model):

class Issue(models.Model):
    project = models.ForeignKey(Project, related_name='issues')
    progress = models.IntegerField(default=0)

我想在项目模型中有一个进度方法,它会返回相关问题进度的平均值。

我尝试了以下方法,但我得到了相关的问题列表。

def progress(self):
    return self.issues.annotate(models.Avg('progress'))

谢谢你的帮助。

4

1 回答 1

2

你想要的是:

def progress(self):
    aggregate = self.issues.aggregate(models.Avg('progress'))
    return aggregate['progress_avg']

如果您确实打算在项目列表视图中显示每个项目的进度,请使用以下内容:

for project in Project.objects.annotate(progress_avg=models.Avg('issues__progress')):
    print project.progress_avg

后一个示例对于列表视图会更好,因为它避免了 N+1 问题(列表中每个项目的 1 个聚合查询)。

于 2013-05-08T15:18:26.093 回答