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)
  }
]>
Вернуться на верх