如何使用 django 查询集按小时对对象进行分组?
Posted
技术标签:
【中文标题】如何使用 django 查询集按小时对对象进行分组?【英文标题】:How to group objects by hour with django querysets? 【发布时间】:2019-08-19 20:31:17 【问题描述】:假设我有一个看起来像这样的模型:
class Action(models.Model):
timestamp = models.DateTimeField(default=timezone.now)
# ...
我如何在视图中,
获取所有操作对象Action.objects
将它们分组到 24 个括号中(使用 QuerySet 属性,可能是 group
?),如下所示:
0: [Action1, Action2, Action3], # timestamp between 00:00 and 00:59, any day
1: [Action4], # timestamp between 01:00 and 01:59, any day
# ...
23: [ActionN] # timestamp between 23:00 and 23:59, any day
基本上,我想要一个图表来显示已完成的操作数,分辨率为一小时。
【问题讨论】:
见这里***.com/questions/30465013/django-group-by-hour 【参考方案1】:您可以利用ExtractHour 函数从您的日期时间字段中获取小时,然后将您的记录分组到dict
。
供您参考的示例代码:
from collections import defaultdict
from django.db.models.functions import ExtractHour
# create a new field to extract hour from timestamp field
actions = Action.objects.annotate(hour=ExtractHour('created'))
# create a default dict to insert a list if key is not exist
results = defaultdict(lambda: [])
for row in actions:
results[row.hour].append(row)
注意:
如果您使用的是mysql数据库,请记住在使用Extract
函数之前加载时区信息
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
【讨论】:
以上是关于如何使用 django 查询集按小时对对象进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
使用SQL语言了解Django ORM中的分组(group by)和聚合(aggregation)查询