Вложенные запросы, подобные вашему, не могут быть легко определены в синтаксисе ORM. Подзапрос ограничен коррелированными подзапросами, возвращающими одно значение. Это часто приводит к искаженным и неэффективным обходным решениям ORM для запросов, которые можно легко выразить в SQL.
В этом случае вы можете использовать две оконные функции в сочетании с отдельным предложением.
result = (Event.objects
.values('date', 'amount')
.annotate(day_sum=Window(
expression=Sum('amount'),
partition_by=[F('date')],
))
.annotate(total=Window(
expression=Sum('amount'),
frame=RowRange(start=None, end=0),
order_by=F('date').asc(),
))
.distinct('date')
.order_by('date', '-total')
)
Вам необходимо заказать по '-total'
, иначе distinct
отбрасывает неправильные строки, оставляя вам меньше правильных сумм в total
.
Что касается пропущенных дней; SQL не имеет внутренней концепции календарей (и, следовательно, пропущенных дат), и если у вас нет большого количества данных, будет проще добавить пропущенные дни в цикл Python. В SQL вы можете сделать это с помощью календарной таблицы .