基于日期列表的django过滤器queryset并获取每天的计数

问题描述

我有这样的模特

class MyModel(models.Model):
  date = models.DatetimeField(auto_Now_add=True)

我有一个日期列表(最近7天的日期,也可以是最近30天的日期)。我想做的是获取在所有日期的特定日期创建的MyModel对象的数量。如下所示。

[{'date1': 2},{'date2': 3},{'date3': 7}....{'daten':26}]

字典的键是日期,值是在特定日期创建的对象数。通过使用forloop并多次击中db,我得到了输出,但是有没有办法从单个查询中获得它?

解决方法

您可以进行查询以计算每个日期的对象数:

from datetime import timedelta
from django.db.models import Count,F
from django.utils.timezone import now

qs = MyModel.objects.filter(
    date__date__gte=now().date()-timedelta(days=30)
).values(
    datedate=F('date__date')
).annotate(
    number=Count('pk')
).order_by('datedate')

接下来,我们可以将其后处理为字典列表,或者最好是将单个数据映射到计数上的单个字典:

# list of dictionaries
[{r['datedate']: r['number']} for r in qs]

# single dictionary
{r['datedate']: r['number'] for r in qs}

如果不存在该日期,则该日期将不在字典中。因此,不在词典中的日期具有计数0。这是由于封闭世界假设(CWA)