【问题标题】:How to group objects by hour with django querysets?如何使用 django 查询集按小时对对象进行分组?
【发布时间】: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
    }
    

基本上,我想要一个图表来显示已完成的操作数,分辨率为一小时。

【问题讨论】:

标签: django python-3.x django-models django-queryset


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2014-01-25
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2015-07-28
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多