2012-04-14 3 views
1

J'ai un modèle Post qui a un champ datetime.date pour posted_date. J'ai besoin de trouver combien de messages sont faits par un utilisateur chaque jour. Créer une requête pour chaque jour semble stupide.Comment obtenir le nombre de messages sur chaque jour avec des annotations dans Django?

Je ne pouvais pas comprendre comment faire la requête API d'agrégation en utilisant annoter.

est-

Post.objects.filter(author=someuser).annotate(dailycount=Count('posted_day')) 

la bonne façon? Alors, comment puis-je l'utiliser pour obtenir le nombre de messages pour un jour particulier?

Mon modèle est:

class Post(models.Model): 
    posted_day=models.DateField(default=date.today) 
    author=models.ForeignKey(User,null=True) 

Répondre

1

Vous y êtes presque. Vous avez besoin de deux clauses supplémentaires:

day_counts = Post.objects.filter(author=someuser).values('posted_day').annotate(
             dailycount=Count('posted_day')).order_by() 

Le values('posted_day') permet le regroupement et le vide order_by les résultats sont de garantir au commandés par posted_day de sorte que la commande par défaut ne gêne pas.

La documentation la plus claire de ceci semble être dans la section Django Aggregation docs sur le Order of annotate() and values() clauses.

values retourne un list de dicts comme:

[{'posted-day': 'the-first-day', 'dailycount': 2}, . . . , 
{'posted-day': 'the-last-day', 'dailycount': 3}] 

donc si vous vouliez le dernier jour, l'utilisateur a affiché, ce serait le dernier élément de la liste:

last_day_dict = day_counts[-1] 
date = last_day_dict['posted_day'] 
count = last_day_dict['dailycount'] 

Vous pouvez ensuite comparez date à today() pour voir si elles correspondent, et si elles ne le font pas l'utilisateur n'a pas posté aujourd'hui, et s'il l'a fait, il a posté count fois.

+0

merci pour la réponse..du jeu de queues retourné, comment puis-je trouver le nombre de messages sur 'day1' qui est dit' datetime.date.today() '? – damon

+0

@damon J'ai ajouté plus d'informations à ma réponse. – agf

+0

merci beaucoup @agf – damon

Questions connexes