django 根据日期列表过滤查询集并获取每天的计数
django filter queryset based on list of dates and get the count on each day
我有这样的模型
class MyModel(models.Model):
date = models.DatetimeField(auto_now_add=True)
我有一个日期列表(过去 7 天的日期,也可以是过去 30 天的日期)。我想要做的是获取所有日期中特定日期创建的 MyModel 对象的数量。如下所示。
[{'date1': 2}, {'date2': 3}, {'date3': 7}....{'daten':26}]
字典的键是日期,值是在该特定日期创建的对象数。通过使用 forloop 并多次点击数据库,我得到了输出,但是有没有办法从单个查询中获取它?
您可以进行查询以计算每个日期的对象数:
from datetime import timedelta
from django.db.models import Count, F
from django.utils.timezone import now
qs = MyModel.objects.filter(
<b>date__date__gte=now().date()-timedelta(days=30)</b>
).values(
<b>datedate=F('date__date')</b>
).annotate(
<b>number=Count('pk')</b>
).order_by('datedate')
接下来我们可以 post-process 将其添加到字典列表,或者更好的是将数据映射到计数上的单个字典:
# list of dictionaries
[<b>{r['datedate']: r['number']}</b> for r in qs]
# single dictionary
{<b>r['datedate']: r['number']</b> for r in qs}
如果日期不存在,它就不会出现在字典中。所以不在字典中的日期计数 0
。这是由于 封闭世界假设 (CWA)。
我有这样的模型
class MyModel(models.Model):
date = models.DatetimeField(auto_now_add=True)
我有一个日期列表(过去 7 天的日期,也可以是过去 30 天的日期)。我想要做的是获取所有日期中特定日期创建的 MyModel 对象的数量。如下所示。
[{'date1': 2}, {'date2': 3}, {'date3': 7}....{'daten':26}]
字典的键是日期,值是在该特定日期创建的对象数。通过使用 forloop 并多次点击数据库,我得到了输出,但是有没有办法从单个查询中获取它?
您可以进行查询以计算每个日期的对象数:
from datetime import timedelta
from django.db.models import Count, F
from django.utils.timezone import now
qs = MyModel.objects.filter(
<b>date__date__gte=now().date()-timedelta(days=30)</b>
).values(
<b>datedate=F('date__date')</b>
).annotate(
<b>number=Count('pk')</b>
).order_by('datedate')
接下来我们可以 post-process 将其添加到字典列表,或者更好的是将数据映射到计数上的单个字典:
# list of dictionaries
[<b>{r['datedate']: r['number']}</b> for r in qs]
# single dictionary
{<b>r['datedate']: r['number']</b> for r in qs}
如果日期不存在,它就不会出现在字典中。所以不在字典中的日期计数 0
。这是由于 封闭世界假设 (CWA)。