2010-12-06 18 views
7

Estoy tratando de hacer una función agregada django, pero no puedo producir el resultado deseado.Django y Agregado: ¿Suma de valores distintos?

Lo que tengo:

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

resultado deseado:

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

que necesita sumar los campos 'cantidad' que tienen el mismo category__name.

Respuesta

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

documentación pertinente: http://docs.djangoproject.com/en/dev/topics/db/aggregation/ –

+1

La razón por la que esto funciona es porque [ '.annotate()' funciona de forma ligeramente diferente después de un ' .values ​​() '] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values):" Sin embargo, cuando se utiliza una cláusula values ​​() para restringir las columnas que se devuelven en el conjunto de resultados, el método para evaluar anotaciones es ligeramente diferente. En lugar de devolver un resultado anotado para cada resultado en el QuerySet original, los resultados originales se agrupan de acuerdo con las combinaciones únicas de los campos especificados en la cláusula values ​​() ". – mgalgs

2

Si usted está en Postgres, puede utilizar la django-pg-utilspackage para la suma de valores distintos.

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