Django查询以获取以前值的总和

Django查询以获取以前值的总和,django,postgresql,django-queryset,window-functions,Django,Postgresql,Django Queryset,Window Functions,下面是存储操作的日志表。覆盖操作是指存储的绝对值,而添加和子操作是方差值。覆盖操作类似于检查点 Id operation quantity --------------------------------------------------------- 1 ADD 10.00 2 ADD 20.00 3 OVERRIDE 15.00 4 SUB -5

下面是存储操作的日志表。覆盖操作是指存储的绝对值,而添加和子操作是方差值。覆盖操作类似于检查点

Id    operation       quantity   
---------------------------------------------------------
1     ADD             10.00 
2     ADD             20.00 
3     OVERRIDE        15.00 
4     SUB            -5.00   
5     SUB            -10.00    
我的目标是通过一个查询获得以下结果

Id    operation       quantity       calculated_total_quantity
---------------------------------------------------------
1     ADD             10.00          10.00
2     ADD             20.00          30.00
3     OVERRIDE        15.00          15.00
4     SUB            -5.00           10.00
5     SUB            -10.00          0.00
我尝试了以下查询


Logs.objects.all().annotate(
   calculated_total_quantity=Case(
        When(operation="OVERRIDE", then=F('quantity')),
        default=Window(
            expression=Sum(F('quantity')),
            order_by=F('id').asc()
        )
    )
)
通过此查询,我得到了错误的结果:

Id    operation       quantity       calculated_total_quantity
---------------------------------------------------------
1     ADD             10.00          10.00
2     ADD             20.00          30.00
3     OVERRIDE        15.00          15.00
4     SUB            -5.00           40.00
5     SUB            -10.00          30.00
我知道错误是由于Sum表达式引起的,所以我的问题是,是否有任何方法可以在重写日志操作时重置Sum表达式以重新启动


如果有人能帮我,我将不胜感激。

在这个问题上你不需要案例。。。 简单地写

Logs.objects.all().annotate(
   calculated_total_quantity=Window(
            expression=Sum(F('quantity')),
            order_by=F('id').asc()
        )
    )

在这个查询中不需要Case。。。 简单地写

Logs.objects.all().annotate(
   calculated_total_quantity=Window(
            expression=Sum(F('quantity')),
            order_by=F('id').asc()
        )
    )

避免在django中进行复杂的数据库查询。相反,编写一个数据库视图,它只会简化django ORM,当然也会让您的生活更轻松:)避免django中复杂的数据库查询。相反,编写一个数据库视图,它只会简化django ORM,当然也会让您的生活更轻松:)