django queryset 获取组的平均值

Posted

技术标签:

【中文标题】django queryset 获取组的平均值【英文标题】:django queryset to get average of a group 【发布时间】:2013-04-26 01:18:00 【问题描述】:

这有点棘手!

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

用户时间戳使用

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

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

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

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

【问题讨论】:

【参考方案1】:

我会说这是一个典型的查询不完全映射到您的模型的案例。 结果的类型为 (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)

【讨论】:

以上是关于django queryset 获取组的平均值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Dataframe:获取组内每个子组的第一行的平均值

如何在django中将QuerySet过滤到每个组的最大成员?

如何在Django中获取具有特定权限组的所有用户的列表

从 django 中的一组对象中获取平均值

Django Aggregation聚合

将每个值除以其组的平均值