Аннотация полей в 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(...)