没有其他日期字段的 Django TruncHour

标签 django python-3.x

我有一系列来自已爬网帖子的时间戳。现在我想显示一个统计数据,其中将显示帖子作者的事件。

为此,我想以天和小时为单位过滤帖子的时间(模型帖子包含日期时间字段“时间戳”)。这几天的过滤工作有效。我想显示帖子的创建时间(11:00、09:00 等)。

我想过滤数据集

from django.db.models.functions import TruncHour
from django.db.models import Count
from .models import Posts

posts = Posts.objects.all()
hours = posts.annotate(hour=TruncHour('timestamp')).values('hour').annotate(count=Count('id'))

但是通过这个过滤器,我收到了一堆包含不同日、月、年的小时......我只想接收没有其他参数的纯小时。

还有路可走吗?欢迎任何线索...

最佳答案

为了获取小时,您可以使用 ExtractHour [Django-doc] ,不是TruncateHour [Django-doc] 截断到小时。

因此您可以使用表达式:

from django.db.models import Count
from django.db.models.functions import <b>ExtractHour</b>

posts = Posts.objects.annotate(
    hour=<b>ExtractHour('timestamp')</b>
).values('hour').annotate(
    count=Count('id')
)<b>.order_by('hour')</b>

请注意,如果没有该时间的timestamp,那么结果中当然不会有该时间的记录。因此计数为零,该行根本不存在。

.order_by 用于强制 Django GROUP BY ,从而“折叠”同一小时的值。

Django 将为此生成一个查询,如下所示:

SELECT EXTRACT(HOUR FROM CONVERT_TZ(post.timestamp, 'UTC', 'UTC')) AS hour,
       COUNT(post.id) AS count
FROM post
GROUP BY EXTRACT(HOUR FROM CONVERT_TZ(post.timestamp, 'UTC', 'UTC'))
ORDER BY hour ASC

关于没有其他日期字段的 Django TruncHour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54875324/

相关文章:

django - 如何在 Django 模型中将选项传递给 CloudinaryField?

python - 跨多列实现 Django 2.2 数据库约束

python - Django CSRF_TOKEN 问题仅与 Edge 相关

python - 如何在python中将元素添加到列表中?

python - 在 virtualenv 中运行 createsuperuser 时出错

python - 如何使 django 中的 FileField 成为可选的?

django 1.10 一个应用程序页面带有链接重定向到另一个应用程序页面

python - 如何使用python从表中获取所有列并将其作为csv文件保存在s3中

python - 为什么 Python 3 中的切片仍然是副本而不是 View ?

python - 有没有一种方法可以禁用定义 __getitem__ 方法的类的迭代而不对键施加约束?