django queryset获取组的平均值

时间:2013-05-02 00:05:12

标签: python django django-queryset django-filter

这有点棘手!

我有一个数据库,用于跟踪每个用户以KB为单位的每小时下载用量(每天24个条目); 看起来像这样..

用户时间戳使用

user1 2013-0501 14:00:00 229

user2 2013-0501 14:00:00 103

user1 2013-0501 13:00:00 220

user2 2013-0501 13:00:00 103

现在我需要每天每个用户的平均使用量

为此创建查询集的任何方法?

我想这样做..(但不能执行)

为每个用户(捆绑)或获取当天的条目并平均它们.. 但这就是我的全部!

myValue = Members.objects.order_by('-time')
myValue = myValue.filter(user='user1')
myValue = myValue.annotate(dcount=Count('timestamp'))

如何获取“myValue.annotate(dcount = Count('timestamp__day'))的计数或更好的列表” 并得到该捆绑的平均值..

myAvg = myValue.aggregate(Avg('usage'))

感谢您的帮助,请告诉我这是否令人困惑!

1 个答案:

答案 0 :(得分:0)

我想说这是一个典型的查询案例,它不能完全映射到您的模型。 结果是类型(user,date,avg_usage),对于类型的固定用户(date,avg_usage)。因此,它不能很好地映射到单个用户对象,也不能映射到单个user_usage条目。这就是为什么内置聚合的ORM不会让你走得太远。(AFAIK)

由于这是一个非常简单的SQL查询,我将使用原始SQL路由(https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly):

假设date(timestamp)是将时间戳转换为日期的SQL操作(取决于数据库),user_usage是表,这些是查询:

为一个用户提供此功能:

select date(timestamp) as date, avg(usage) 
    from user_usage where user_id = %s  
    group by date(timestamp)

并立即为所有用户提供此功能:

select user_id, date(timestamp) as date, avg(usage) 
    from user_usage
    group by user_id,date(timestamp)