【问题标题】:django filter queryset based on list of dates and get the count on each daydjango 根据日期列表过滤查询集并获取每天的计数
【发布时间】:2020-12-10 00:51:21
【问题描述】:

我有一个这样的模型

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

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

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

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

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

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

    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)

    【讨论】:

    • 太棒了!这就像一个魅力。有什么方法可以将对象计数为 0 的条目也填充到 dict 中?
    • @SandeepBalagopal:您应该遍历范围内的date 对象,并手动添加额外的值。因此,对字典/列表进行后期编辑。除了那个号码。
    • 我遇到了这个问题。似乎 group by 不起作用。这就是我得到的
    • @SandeepBalagopal:你使用datetime 所以包括 time 部分。时间戳完全相同的可能性不是很大。这就是为什么我们使用F('date__date') 所以使用__date 查找将其转换为date 对象。
    • 我刚刚通过 qs = MyModel.objects.filter( date__date__gte=now().date()-timedelta(days=30) ).values( 'date__date' ).annotate( number =Count('pk') ).order_by('date__date')
    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多