Django ORM Запрос для нахождения среднего значения между временными метками

Я пытаюсь понять, как структурировать запрос.

У меня есть три модели, которые я унаследовал, билеты, комментарии и действия:

class Ticket(models.Model):
    date = models.DateTimeField(default=datetime.datetime.now, blank=True)
    subject = models.CharField(max_length=256)
    description = models.TextField()

И

class Comments(models.Model):
    date = models.DateTimeField(default=datetime.datetime.now, blank=True)
    comment = models.TextField()
    action = models.ForeignKey(Label, on_delete=models.CASCADE, limit_choices_to={'group__name': 'action'}, related_name='action_label')
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)

И

class Label(models.Model):
    name = models.CharField(max_length=50)
    group = models.ForeignKey(LabelGroup, on_delete=models.CASCADE)

Моя цель - получить средний промежуток времени между Ticket.date (открыто) и последним Comment.date типа Label.name = containment. Наконец, я хочу передать диапазон дат (начальная_дата, конечная_дата), чтобы ограничиться только билетами в пределах этого периода времени.

В конечном итоге, я хочу вернуть:

{
avg_time_to_contain: 37,
avg_time_to_recover: 157
}

с точки зрения DRF.

Набор запросов, который у меня есть на данный момент, следующий:

queryset = Comments.objects.filter(ticket__date__gte=start_date, ticket__date__lte=end_date).filter(action__name__icontains="containment").distinct(ticket).aggregate(avg_containment=Avg(F(date)- F(ticket__date)))

Я получаю ошибку, говорящую, что инцидент не определен. Я полагаю, что это связано с моей отличительной функцией, но мне трудно заставить свой мозг перевести то, что мне нужно.

Псевдокод для запроса (в моем представлении),

  • Захватите комментарии, в которых есть билеты (FK) с датами между датой начала / окончания
  • Фильтр по имени действия (FK), в котором содержится работа
  • Просто возьмите один отдельный билет за раз (чувствую, что делаю это неправильно, в основном я хочу иметь последнюю запись для каждого билета, чтобы иметь возможность получить разницу между открытым и последним комментарием сдерживания, а затем усреднить разницу во времени)
  • Получаем среднее значение комментария даты сдерживания - даты открытия.

Спасибо за любой свет, который вы можете пролить, чтобы помочь мне попасть туда, куда я хочу попасть.

BCBB

Очевидно, ИИ принял ваш вопрос и ответил на него: https://twitter.com/taranjeetio/status/1598392124373803008

Вернуться на верх