Django ORM,通过查询求和列值

Django ORM, Sum column values through query

我有一个 table 具有以下值:

user amount date
John 10 2017-07-01
John 20 2019-07-01
John 30 2020-09-01
John 40 2021-11-01
... ... ...
Dan -20 2019-02-01
Dan -30 2020-04-01
Dan -40 2021-06-01

函数的输入是一个日期范围,例如:

date_start = '2019-01-01'
date_end = '2021-11-07'

预期输出:

对于所有用户,对于这个日期范围内的每个日期,我想 return sumamounts,从当前日期到所有以前的日期,像这样:

user amount date
John 30 (10+20) 2019-07-01
John 60 (10+20+30) 2020-09-01
John 100 (10+20+30+40) 2021-11-01
... ... ...
Dan -20 2019-02-01
Dan -50 (-20-30) 2020-04-01
Dan -90 (-20-30-40) 2021-06-01

我的努力

def get_sum_amount(self, date_start=None, date_end=None):
    date_detail = {}
    # Minimum date
    if date_start:
        date_detail['date__gt'] = date_start

    # Maximum date
    if date_end:
        date_detail['date__lt'] = date_end

    detail = Financial.objects.filter(Q(**date_detail)) \
        .values('user') \
        .annotate(sum_amount=Coalesce(Sum(F('amount')), Value(0)))

但没有结果。

已更新

上述示例的函数输出为:

user amount
John 100
Dan -90

您可以使用 Window 函数,分区为 user 到 运行 每个用户的累计总和,按日期排序:

detail = Financial.objects.filter(**date_detail).annotate(
    running_amount=Window(
        expression=Sum('amount'),
        partition_by=[F('user')],
        order_by=F('date').asc(),
    )
)