Django ORM查询-使用条件条件时的内部总和

时间:2018-09-20 05:27:35

标签: django python-3.x django-rest-framework django-orm

我有一张桌子,我们称它为DummyTable。 它具有字段-price_effectivestore_invoice_updated_datebag_statusgstin_code

现在我想从store_invoice_updated_dategstin_code字段中获取按月,年分组的输出。

我想和那个小组一起做这些计算-

如果bag_status状态不是“ return_accepted”或“ rto_bag_accepted”,则price_effective的总和为“ forward_price_effective”。在这里不知道如何进行排除,即在注释中使用过滤器

如果bag_status为“ return_accepted”或“ rto_bag_accepted”,则价格总和为“ return_price_effective”。

从“ forward_price_effective”中减去“ return_price_effective”的“ total_price”字段。

我已经制定了此查询,该查询不起作用

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 :(得分:0)

通过多个查询集解决。 只是找不到一种适当地将“案例”与“何时”与“过滤器”和“排除”一起使用的方法。

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')