2017-07-27 1 views
1

Je veux suivre le nombre d'animaux nés dans la gamme d'années donnée chaque année. Donc, je peux être en mesure de déterminer quelle année a le plus d'animaux nés. J'utilise ces données pour les rapports graphiques.Obtenir le nombre annuel dans la fourchette d'années donnée

class Animal(models.Model): 
    # omitted fields.. 
    date_of_birth = models.DateField() 

Maintenant, les années 2015 serait donnée à 2017. Je voudrais obtenir le résumé des animaux nés dans cette année.

E.g.

[ 
    {'year': 2015, total: 10}, 
    {'year': 2016, total: 15} 
    {'year': 2017, total: 4} 
] 

Jusqu'à présent, voici ce que je l'ai fait:

Animal.objects.filter(
    date_of_birth__year__range = (
     '2017', '2018' 
    ) 
).extra(
    select={'year': 'YEAR(date_of_birth)'} 
).values('year').annotate(total=Count('id')).values('year', 'total') 

Mais obtenu ceci:

[ 
    { 
     "total": 1, 
     "year": 2015 
    }, 
    { 
     "total": 1, 
     "year": 2015 
    }, 
    { 
     "total": 1, 
     "year": 2015 
    }, 
    { 
     "total": 1, 
     "year": 2015 
    }, 
    ... and so on to 2017 
] 

Il n'a pas ajouté le total et il n'a pas regroupés par année.

Répondre

2

champ Vous avez probablement la commande dans la classe Meta pour le modèle animal, champ si supplémentaire ajouté au groupe par et générer un mauvais résultat. Vous pouvez essayer de supprimer la commande, vous pouvez lire à ce sujet dans docs:

Animal.objects.filter(
    date_of_birth__year__range = (
     '2017', '2018' 
    ) 
).extra(
    select={'year': 'YEAR(date_of_birth)'} 
).values('year').annotate(total=Count('id')).order_by() 

valeurs aussi deuxième pas nécessaire.

+0

Wow im étonner l'homme merci pour votre réponse, il fournit la bonne solution –

0

Essayez, remplacer id sur l'année

Animal.objects.filter(
    date_of_birth__year__range = (
     '2017', '2018' 
    ) 
).extra(
    select={'year': 'YEAR(date_of_birth)'} 
).values('year').annotate(total=Count('year')).values('year', 'total') 
+0

H merci pour votre réponse rapide, mais j'ai obtenu 'Ne peut pas résoudre le mot 'année' en champ' –