2010-12-06 17 views
7

J'essaye de faire une fonction d'agrégat de django, mais je suis incapable de produire le résultat désiré.Django et agrégat: somme de valeurs distinctes?

Ce que j'ai:

income_posts.values_list('category__name','amount') 
[(u'Donation', Decimal("2000.00")), (u'Paycheck', Decimal("1200.00")), (u'Donation', Decimal("1000.00"))] 

Résultat souhaité:

[(u'Donation', Decimal("3000.00")), (u'Paycheck', Decimal("1200.00))] 

J'ai besoin pour sommer les champs 'montant' qui ont le même category__name.

Répondre

14

De this answer for a related question:

from django.db.models import Sum 
income_posts.values('category__name').order_by('category__name').annotate(total=Sum('amount')) 
+0

La documentation pertinente: http://docs.djangoproject.com/en/dev/topics/db/aggregation/ –

+1

La raison pour laquelle cela fonctionne est parce que [ '.annotate()' fonctionne un peu différemment après un ' .values ​​() '] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values):" Cependant, lorsqu'une clause values ​​() est utilisée pour contraindre les colonnes renvoyées Dans le jeu de résultats, la méthode d'évaluation des annotations est légèrement différente: au lieu de renvoyer un résultat annoté pour chaque résultat dans le QuerySet d'origine, les résultats d'origine sont regroupés selon les combinaisons uniques des champs spécifiés dans la clause values ​​(). – mgalgs

2

Si vous êtes sur Postgres, vous pouvez utiliser la django-pg-utilspackage pour la somme des valeurs distinctes.

from pg_utils import DistinctSum 
income_posts.annotate(total=DistinctSum('amount')