django 在从午夜到现在的每个小时间隔内创建的记录计数

oxf4rvwz  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(87)

我需要检索从午夜到现在的时间在每个小时内创建的记录计数。为此,模型包含一个created_at时间戳字段,该字段将记录创建时间。模型定义如下。

class Token(models.Model):
    customer_name = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)
    remarks = models.TextField(null=True,blank=True)
    modified_at = models.DateTimeField(auto_now =True)

我在SQL输出中寻找的结果如下

Intervel  | count|
-----------------|       
01:00 AM  |   0  |  # 00:00 to 01:00 AM 
02:00 AM  |   0  |
   .......
10:00 AM  |  20  |
11:00 AM  |   5  |
  ........
03:00 PM  |   5  |
------------------

我需要得到模型查询,可以在数据库端执行上述操作,而无需加载从午夜到现在一天中创建的所有记录,然后通过在应用程序中运行forloop来获取计数。请帮我这个忙。

dnph8jn4

dnph8jn41#

您需要使用valuesannotate来实现这一点。

from django.db.models import Count 
from your_models import Token 
from django.utils import timezone

# Get records for today.
records_today = Token.objects.filter(created_at__date=timezone.now().date()) 

# Group the records by the hour, then annotate will work on that group. 
per_hour_count = record_today.values("created_at__hour").annotate(count=Count("pk")).order_by("created_at")
tpgth1q7

tpgth1q72#

你可以先用计数提取项目,但这还不够,因为可能有几个小时根本没有活动,数据库在“封闭世界假设”下工作。
因此,我们查询,与:

from django.db.models import Count
from django.db.models.functions import ExtractHour
from django.utils.timezone import now

data = (
    Tokent.objects.filter(
        created_at__gte=now().replace(hour=0, minute=0, second=0, microsecond=0)
    )
    .values(hour=ExtractHour('created_at'))
    .annotate(number=Count('pk'))
    .order_by('hour')
)
data = {data['hour'] + 1: data['count']}
for h in range(1, 25):
    data.setdefault(h, 0)

因此,在这里我们首先查询数据,然后将其后处理到字典中,最后为1-24范围内没有数据的小时设置值。

相关问题