首页 > 解决方案 > django 根据日期列表过滤查询集并获取每天的计数

问题描述

我有一个这样的模型

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

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

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

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

标签: djangodjango-querysetdjango-orm

解决方案


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

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}

如果日期不存在,它将不在字典中。所以字典中没有的日期有 count 0。这是由于封闭世界假设(CWA)


推荐阅读