Django平均在一个日期范围内

时间:2013-04-19 14:14:55

标签: python mysql django

我有一个在Django中构建的简单的正常运行时间监控应用程序,用于检查站点是否不响应ping请求。它存储在“dt”列中固定的时间戳和“ms”列中的毫秒响应时间。该网站每分钟都会被ping,并且会在数据库中输入一个条目。

Django模型如下所示:

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'))

谢谢!

1 个答案:

答案 0 :(得分: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}]