2013-04-19 2 views
3

사이트가 핑 요청에 응답하지 않는지 확인하는 장고에 내장 된 간단한 가동 시간 모니터링 앱이 있습니다. 열 "dt"에 핑 (ping) 된 시간 소인 및 "ms"열의 밀리 초 응답 시간을 저장합니다. 사이트가 매분 ping되고 항목이 데이터베이스에 저장됩니다.장고 평균 날짜 범위

장고 모델은 다음과 같습니다

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

나는 DT 열에서 한 번에 하나의 일을 잡아 그 날의 MS 응답 시간의 평균을하고 싶습니다. 하루에 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에 아무 것도 가지고 있지 않으므로 쿼리에 "추가"매개 변수를 추가해야합니다.이 매개 변수는 날짜 만 사용하도록 지정합니다. 그런 다음 해당 값만 선택하고 주석을 추가합니다.

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

을 Btw는이 스케일링에 올 때, 이것은 당신이 몇 백이있는 경우 느린 얻을 시작, 다음과 같은

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

이 당신에게 목록을 제공해야합니다

다음 시도 백만 행. 그 이유는 당신은 단지 날짜 부분에 db 인덱스를 가질 수없고, 당신은 일일 집계 만하고 싶어하는 것처럼 보입니다. mysql에 별도의 날짜 열과 시간에 대한 또 다른 열을 하루에 초 수의 정수로 사용하는 것이 좋습니다. 이렇게하면 향후 질의 방식을 더 빠르게 할 수 있습니다. – aminland

+0

감사합니다. 확장 성은 큰 관심사이므로 귀하의 통찰력에 감사드립니다. –