【问题标题】:Counting rows from each day from last 60 days计算过去 60 天内每天的行数
【发布时间】:2017-05-15 13:27:01
【问题描述】:

我想统计过去 60 天内每天的行数并将其作为列表返回。

models.py

class Error(models.Model):
    name = models.CharField(max_length=250)
    adding_time = models.DateTimeField(auto_now=True)

在我的数据库中:

   name    | adding_time
   ------------------------------------
   error_1 | 2017-04-10 10:47:33.204518
   error_2 | 2017-04-10 11:01:12.339936
   error_3 | 2017-04-21 08:40:56.862731
   error_4 | 2017-04-21 08:45:50.235212

我想要实现的是当天的日期列表和计数行:

[{'count': 2, 'adding_date': '2017-04-10'}, {'count': 2, 'adding_date': '2017-04-21'}]

到目前为止,我做了这样的事情:

last_30_days_errors = Error.filter(adding_time__lte=datetime.datetime.today(),adding_time__gt=datetime.datetime.today()-datetime.timedelta(days=60))

errors_dates = last_30_days_errors.extra({'adding_date': 'date(adding_time)'}).values('adding_date')

它正在返回:

>>> [{'count': 1, 'adding_date': '2017-04-10'}, {'count': 1, 'adding_date': '2017-04-10'}, {'count': 1, 'adding_date': '2017-04-21'}, {'count': 1, 'adding_date': '2017-04-21'}]

我可以解析它,但是有什么方法可以通过查询来完成吗? 谢谢你。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    试试这个

    from django.db.models import Count
    last_30_days_errors.extra({'adding_time':"date(adding_time)"}).values('adding_time').annotate(count=Count('id'))
    

    【讨论】:

    • 工作!谢谢!
    【解决方案2】:
    import pytz
    from django.db.models import Count
    from django.db.models.expressions import DateTime
    annotate_list = [Count('id')]
    group_by_list = ["interval"]
    last_30_days_errors.annotate(interval=DateTime('adding_time', "days",pytz.timezone("UTC"))).values(*group_by_list).annotate(*annotate_list)
    

    【讨论】:

    • 不应使用上述答案中使用的 .extra 。在这里查看==> imgur.com/Qn4SQD5
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2017-04-02
    相关资源
    最近更新 更多