2017-05-15 1 views
0

Je voudrais compter les lignes de chaque jour des 60 derniers jours et les renvoyer sous forme de liste.Comptage des lignes de chaque jour des 60 derniers jours

models.py

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

Dans la base de données que j'ai:

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 

Ce que je voudrais obtenir est la liste des dates et des lignes comptai en ce jour-là:

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

Jusqu'ici, j'ai fait quelque chose comme ceci:

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') 

Il revient:

>>> [{'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'}] 

je peux l'analyser, mais est-il une méthode pour le faire par une requête? Merci.

Répondre

2

Essayez cette

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

travail! Je vous remercie! – Dzawor

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)