Аннотировать queryset средним различием в дате? (django)

Я искал на всем протяжении места ответ на это, но ничего не мог найти. Возможно, это - просто глупый вопрос или действительно хитрый.Вот:

Скажем, моя модель - это (псевдо код django):

Event
  type = ForeignKey(EventType)
  name = CharField
  date_start = DateField
  date_end = DateField

EventType
  name = CharField

То, что я хочу знать, является средним временем продолжительности для каждого типа события. Что я делаю теперь, вычисляют среднюю продолжительность каждый раз, когда новое событие создается (сохраните метод), и сохраните это в average_duration столбце в EventType. Проблема с этим подходом состоит в том, что я не могу ответить на вопросы как, "каково было среднее время продолжительности для событий типа X, в течение года Y". Таким образом вместо того, чтобы добавить больше столбцов для ответа на вопросы как они я предпочел бы иметь, в котором выполняют "в реальном времени".

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

13
задан Nicolas R 28 June 2010 в 08:56
поделиться

2 ответа

Я думаю, что лучше всего создать представление SQL со столбцом date_end - date_start , создать модель django в этом представлении, а затем вы сможете запросить просматривайте и комментируйте его по своему усмотрению. Я сделал это с моделями, похожими на вашу, и, возможно, я смогу извлечь для вас какой-нибудь интересный код, если вам нужно.

1
ответ дан 1 December 2019 в 19:14
поделиться

Вам нужно будет создать набор запросов с помощью метода extra, чтобы добавить разницу дат к каждой строке

Затем используйте метод aggregate, чтобы вычислить среднее значение для только что добавленного столбца:

Будьте осторожны, этот метод медленный и не масштабируется. Хранение вычисленного значения в event_type - имхо лучший вариант.

1
ответ дан 1 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: