计算过去60天内每天的行数

时间:2017-05-15 13:27:02

标签: python django django-models django-orm

我想计算过去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'}]

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

2 个答案:

答案 0 :(得分:2)

试试这个

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

答案 1 :(得分:1)

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)