У меня есть приложение для мониторинга работоспособности, встроенное в 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'))
Спасибо!
Btw, когда речь идет о масштабировании, это будет начать, чтобы получить медленно, если у вас есть несколько сотен миллион строк. Причина в том, что вы не можете иметь индекс db только для части даты, и похоже, что вы хотите делать только агрегаты за день. Я бы рекомендовал иметь отдельный столбец даты (индексированный на mysql) и другой столбец для времени как целое число секунд в день. Это ускорит поиск в будущем. – aminland
Спасибо, я! Масштабируемость является большой проблемой, поэтому я ценю ваше понимание. –