2013-05-08 119 views
3

的关系,我有两个实体,即项目和问题定义如下:平均值在Django

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')) 

感谢您的帮助。

回答

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个聚合查询)。

+0

这就是为什么每个问题中出现一个'progress__avg'!感谢你,我现在确实有所作为。注意:'progress__avg'处有两个下划线(可能是论坛的转义问题)。 – martinqt 2013-05-08 15:32:18