2013-04-19 4 views
3

У меня есть приложение для мониторинга работоспособности, встроенное в Django, которое проверяет, не отвечает ли сайт на запрос ping. Он хранит метку времени, когда она была отсканирована в столбце «dt» и миллисекундном времени отклика в столбце «ms». Сайт пингируется каждую минуту, и запись вводится в базу данных.Усреднение Django в диапазоне дат

Джанго модель выглядит следующим образом:

class Uptime (models.Model): 
    user = models.ForeignKey(User) 
    dt = models.DateTimeField() 
    ms = models.IntegerField() 

Я хотел бы, чтобы захватить один день за один раз из колонки DT и взять среднее время отклика мс на этот день. Хотя есть 1440 записей в день, я хотел бы просто захватить день (например, 4-19-2013) и получить среднее время отклика ms. Код, который я использую ниже, несомненно, не так, но я чувствую, что я на правильном пути. Как я могу заставить это работать?

 output_date = Uptime.objects.filter(user = request.user).values_list('dt', flat = True).filter(dt__range=(startTime, endTime)).order_by('dt').extra(select={'day': 'extract(day from dt)'}).values('day') 
     output_ms = Uptime.objects.filter(user = request.user).filter(dt__range=(startTime, endTime)).extra(select={'day': 'date(dt)'}).values('day').aggregate(Avg('ms')) 

Спасибо!

ответ

2

Необходимо выполнить аннотацию, чтобы сделать группу. Django не имеет ничего в orm для извлечения только дат, поэтому вам нужно добавить «дополнительный» параметр в запрос, который указывает только на использование дат. Затем вы выбираете только те значения и аннотируете.

Попробуйте следующее:

Uptime.objects.filter(user=request.user).extra({'_date': 'Date(dt)'}).values('_date').annotate(avgMs=Avg('ms')) 

Это должно дать вам список, как следует:

[{'_date': datetime.date(2012, 7, 5), 'avgMs': 300},{'_date': datetime.date(2012, 7, 6), 'avgMs': 350}] 
+0

Btw, когда речь идет о масштабировании, это будет начать, чтобы получить медленно, если у вас есть несколько сотен миллион строк. Причина в том, что вы не можете иметь индекс db только для части даты, и похоже, что вы хотите делать только агрегаты за день. Я бы рекомендовал иметь отдельный столбец даты (индексированный на mysql) и другой столбец для времени как целое число секунд в день. Это ускорит поиск в будущем. – aminland

+0

Спасибо, я! Масштабируемость является большой проблемой, поэтому я ценю ваше понимание. –

Смежные вопросы