Запрос Django ORM - Сумма внутри аннотации с использованием условия когда - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица, давайте назовем ее DummyTable.У него есть поля - price_effective, store_invoice_updated_date, bag_status, gstin_code.

Теперь я хочу получить вывод, который группирует по месяцам, годам из поля store_invoice_updated_date иgstin_code.

Вместе с этой группой я хочу выполнить эти вычисления -

Сумма price_effective как 'forward_price_effective', если bag_status отличается от 'return_accepted' или 'rto_bag_accepted'.Не знаю, как сделать исключение, то есть использовать фильтр в аннотации

Сумма цены, действующей как «return_price_effective», если bag_status имеет значение «return_accepted» или «rto_bag_accepted».

Поле 'total_price', которое вычитает 'return_price_effective' из 'forward_price_effective'.

Я сформулировал этот запрос, который не работает

from django.db.models.functions import TruncMonth
from django.db.models import Count, Sum, When, Case, IntegerField

DummyTable.objects.annotate(month=TruncMonth('store_invoice_updated_date'), year=TruncYear('store_invoice_updated_date')).annotate(forward_price_effective=Sum(Case(When(bag_status__in=['delivery_done']), then=Sum(forward_price_effective)), output_field=IntegerField()), return_price_effective=Sum(Case(When(bag_status__in=['return_accepted', 'rto_bag_accepted']), then=Sum('return_price_effective')), output_field=IntegerField())).values('month','year','forward_price_effective', 'return_price_effective', 'gstin_code')

1 Ответ

0 голосов
/ 21 сентября 2018

Решено несколькими наборами запросов.Просто не смог найти способ правильно использовать «Case» с «When» с «filter» и «exclude».

basic_query = BagDetails.objects.filter(store_invoice_updated_date__year__in=[2018]).annotate(month=TruncMonth('store_invoice_updated_date'), year=TruncYear('store_invoice_updated_date') ).values('year', 'month', 'gstin_code', 'price_effective', 'company_id', 'bag_status')


forward_bags = basic_query.exclude(bag_status__in=['return_accepted', 'rto_bag_accepted']).annotate(
        Sum('price_effective')).values('year', 'month', 'gstin_code', 'price_effective', 'company_id')

return_bags = basic_query.filter(bag_status__in=['return_accepted', 'rto_bag_accepted']).annotate(
        Sum('price_effective')).values('month', 'gstin_code', 'price_effective', 'company_id')
...