问题描述
我有这样的模特
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)。