2013-05-08 2 views
3

У меня есть два объекта, а именно проект и выпуск определен как следует:Среднего по отношениям в Джанго

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'! Благодаря вам я сейчас понимаю. NB: в 'progress__avg' есть два подчеркивания (возможно, проблема с выходом на форум). – martinqt

Смежные вопросы