Аннотация полей в Django

У меня есть несколько моделей:

class Report(Model):
    projects = ManyToManyField('Project', through='ProjectState')

class Project(Model):
    cost = IntegerFielf()

class ProjectState(Model):
    project = ForeignKey('Project')
    report = ForeignKey('Report')

Мне нужно получить список Report с аннотированным полем avg_cost, которым является среднее Project.cost для каждого report.

Что-то подобное, только работоспособное:

Report.objects.filter(...).annotate(
    avg_cost=Avg(
        Project.objects.values('id', 'cost').filter(
            id__in=OutRef('projects__id')
        )
    )
)

Ответы (1 шт):

Автор решения: Za Ars
Report.objects.filter(...).annotate(
  avg_cost=Avg('projects__cost')
}

Как то так. Если не сработает, перед annotate вставьте prefetch_related, указав поле или через Prefetch объект, если нужно доп сложная фильтрация

<queryset>.prefetch_related('projects').annotate(...)

# Или

<queryset>.prefetch_related(
  Prefetch('projects',  Project.objects.filter(....))
).annotate(...)
→ Ссылка