Django среднее значение, сгруппированное по внешнему ключу
У меня есть эта модель
class Makes(models.Model):
student = models.ForeignKey(...)
instrument = models.ForeignKey(
to='users.Instrument',
on_delete=models.CASCADE
)
begin_date = models.DateField(
null=True,
blank=True
)
end_date = models.DateField(
null=True,
blank=True
)
И я хочу получить среднее значение, для каждого инструмента, временной дельты между begin_date
и end_date
Я попробовал следующее:
from django.db.models import Avg, F, ExpressionWrapper, fields
duration = ExpressionWrapper(F('end_date') - F('begin_date'), output_field=fields.DurationField())
instrument_data = (
Makes.objects
.exclude(begin_date__isnull=True)
.exclude(end_date__isnull=True)
.annotate(duration=duration)
.aggregate(average=Avg(duration))
# I can't even figure out how to also get the instrument name here
)
Но это дало мне среднее значение всех длительностей, а не среднюю длительность по каждому инструменту.
Я также попробовал следующее:
instrument_data = (
Makes.objects
.exclude(begin_date__isnull=True
.exclude(end_date__isnull=True)
.annotate(duration=Avg(duration))
.values('instrument__instrument_name', 'duration')
)
Но это дало мне "Среднее" каждого отдельного экземпляра Makes
Итак, в заключение, как мне получить результат, который выглядит примерно так
<QuerySet[
{
'instrument__instrument_name': 'alt-viool',
'duration': datetime.timedelta(days=142)
},
{
'instrument__instrument_name': 'contrabas',
'duration': datetime.timedelta(days=62)
},
{
'instrument__instrument_name': 'viool',
'duration': datetime.timedelta(days=49)
}
]>