Django Сумма положительных значений отдельно от отрицательных значений - PullRequest
1 голос
/ 21 апреля 2020

Можете ли вы суммировать положительные значения отдельно от отрицательных значений?

У меня есть таблица, которая выглядит следующим образом:

class Order(models.Model):
    date = models.DateField()
    amount = models.DecimalField()

Я ищу получить набор запросов, который суммирует положительные суммы отдельно от отрицательных сумм и групп по неделям:

Year
Week
Sum of positive amounts
Sum of negative amounts

Я могу получить все положительные суммы в неделю отдельно, выполнив:

Order.objects.filter(amount__gt=0).annotate(year_week=Trunc('date', 'week', output_field=DateField())).\
annotate(year=ExtractYear('year_week')).annotate(week=ExtractWeek('year_week')).\
values("year_week", "year", "week").annotate(value=Sum("amount")).order_by("-year_week")

Я могу сделать это снова для отрицательное значение, но тогда у меня есть два отдельных набора запросов. Могу ли я объединить их эффективно, не зацикливая вручную, или есть способ сделать оба в одном запросе?

1 Ответ

1 голос
/ 21 апреля 2020

Да, поскольку , большинство агрегатных функций имеют filter=… параметр [Django -doc] :

from django.db.models import Q, Sum
from django.db.models.functions import ExtractYear, ExtractWeek

Order.objects.values(
    year=ExtractYear('date'),
    week=ExtractWeek('date')
).annotate(
    sum_pos=Sum('amount'<b>, filter=Q(amount__gt=0)</b>),
    sum_neg=Sum('amount'<b>, filter=Q(amount__lt=0)</b>)
).order_by('year', 'week')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...