Grouper les entrées du modèle Django par jour en utilisant son champ datetime

je travaille avec un article comme model qui a un champ DateTimeField (auto_now_add=True) pour capturer la date de publication (pub_date). Cela ressemble à quelque chose comme ce qui suit:

class Article(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

je veux faire une requête qui compte combien de postes d'article ou entrées ont été ajoutés par jour. En d'autres termes, je veux interroger le groupe et les entrées par jour (et, éventuellement, mois, heure, seconde, etc.). Cela ressemblerait à quelque chose comme le suivant dans le SQLite shell:

select pub_date, count(id) from "myapp_article"
where id = 1
group by strftime("%d", pub_date)
;

Qui retourne quelque chose comme:

2012-03-07 18:08:57.456761|5
2012-03-08 18:08:57.456761|9
2012-03-09 18:08:57.456761|1

je n'arrive pas à comprendre comment obtenir ce résultat à partir d'un Django QuerySet. Je suis conscient de la façon d'obtenir un résultat similaire en utilisant itertools.groupby, mais ce n'est pas possible dans cette situation (explication à suivre).

Le résultat de cette requête doit être utilisé dans un graphique montrant le nombre de posts par jour. Je suis d'essayer d'utiliser le Django Chartit emballer pour atteindre cet objectif. Chartit impose une contrainte à la source de données (DataPool). La source doit être un modèle, un gestionnaire, ou QuerySet, donc en utilisant itertools.groupby n'est pas une option pour autant que je sache.

donc la question Est... comment regrouper ou regrouper les entrées par jour et finir avec un objet QuerySet?

9
demandé sur Community 2012-03-09 20:58:11

1 réponses

créer un champ supplémentaire qui ne stocke que les données de date (et non l'heure) et annoter avec Count:

Article.objects.extra({'published':"date(pub_date)"}).values('published').annotate(count=Count('id'))

le Résultat sera:

published,count
2012-03-07,5
2012-03-08,9
2012-03-09,1
31
répondu Murat Çorlu 2012-05-23 20:20:18