Django: Запрос "Группировка по месяцам" с заполнением пустых месяцев
Пытаюсь сгруппировать продажи по месяцам, как показано ниже, что работает идеально
monthbased = any_queryset.annotate(sales_month=TruncMonth('BidDate')
).values('sales_month'
).annotate(sum=Sum(F('Quantity')*F('SellPrice'))
)
Мой вопрос касается месяцев без продаж. Я использую этот результат в гистограмме, и если в каком-либо месяце нет продаж, то эти месяцы не будут отображаться на диаграмме. Я хочу показать пустые месяцы с нулевыми значениями.
Я делал это так
# convert queryset to list of dicts
monthbased_list = [{'sales_month': x['sales_month'], 'sum': x['sum']} for x in monthbased]
# fill empty year and months until utc now
now = datetime.utcnow()
for y in range(now.year-2, now.year+1):
for m in range(1, 13):
if not any(d['sales_month'] == datetime(y, m, 1) for d in monthbased_list):
monthbased_list.append({'sales_month': datetime(y, m, 1), 'sum': 0})
# sort by year and month
monthbased_list = sorted(monthbased_list, key=lambda k: k['sales_month'])
# delete future months
monthbased_list = [x for x in monthbased_list if x['sales_month'] <= now]
Есть ли лучший способ сделать это?
вы можете попробовать добавить значение по умолчанию с помощью Coalesce:
from django.db.models.functions import Coalesce
...
.annotate(sum=Coalesce(Sum(....), 0))
...