我有一系列来自已爬网帖子的时间戳。现在我想显示一个统计数据,其中将显示帖子作者的事件。
为此,我想以天和小时为单位过滤帖子的时间(模型帖子包含日期时间字段“时间戳”)。这几天的过滤工作有效。我想显示帖子的创建时间(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/