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

...
Вернуться на верх