Джанго и Агрегат: сумма различных значений? - PullRequest
11 голосов
/ 07 декабря 2010

Я пытаюсь выполнить агрегатную функцию django, но не могу получить желаемый результат.

Что я получил:

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

Желаемый результат:

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

Мне нужно суммировать поля «количество», которые имеют одинаковую категорию __name.

Ответы [ 3 ]

17 голосов
/ 07 декабря 2010

С этот ответ на связанный вопрос :

from django.db.models import Sum
income_posts.values('category__name').order_by('category__name').annotate(total=Sum('amount'))
5 голосов
/ 20 января 2019

Просто чтобы добавить к ответу arjun27.Поскольку этот пакет, по-видимому, был заброшен, вы можете просто скопировать из него 3 необходимые строки:

from django.db.models import Sum
class DistinctSum(Sum):
    function = "SUM"
    template = "%(function)s(DISTINCT %(expressions)s)"

, которые можно использовать так же, как указано выше:

income_posts.annotate(total=DistinctSum('amount')
3 голосов
/ 11 сентября 2016

Если вы находитесь на Postgres, вы можете использовать пакет django-pg-utils для суммы различных значений.

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