将SQL查询转换为Django ORM

将SQL查询转换为Django ORM,sql,django,postgresql,django-models,django-orm,Sql,Django,Postgresql,Django Models,Django Orm,我有SQL查询,我需要在Django中使用ORM技术 SELECT a.id, a.amount, SUM(b.amount) FROM cashflow_statement a, cashflow_statement b WHERE b.id <= a.id GROUP BY a.id ORDER BY a.id 输入数据 id, amount, date 1. 10 25/06/2020 2. -10 25/06/2020 3. 40 25/06/202

我有SQL查询,我需要在Django中使用ORM技术

SELECT a.id, a.amount, SUM(b.amount)
FROM cashflow_statement a, cashflow_statement b
WHERE b.id <= a.id GROUP BY a.id
ORDER BY a.id
输入数据

id, amount, date
1.    10   25/06/2020
2.    -10   25/06/2020
3.    40   25/06/2020
4.    10   25/06/2020
5.    -30   25/06/2020
6.    10   25/06/2020


Need Output:
id, amount, sum
1.   10.     10 
2.   -10.    0
3.    40.    40
4.   10.     50
5.   -30.    20
6.    10.    30
也许我的代码有错误,但我认为您正在寻找.filter()部分。如果需要同时使用多个过滤器,可以这样想:

x=Statement.objects.filter(date='your date').filter(amount<10)
x=Statement.objects.filter(date='your date')。filter(amount
也许我在代码中有错误,但我认为您正在寻找.filter()部分。如果您需要同时使用多个过滤器,可以这样想:

x=Statement.objects.filter(date='your date').filter(amount<10)

x=Statement.objects.filter(date='your date').filter(amount目前Django不支持子查询中的聚合,但通过一种解决方法,我们可以“欺骗”系统生成正确的查询:

from django.db.models import OuterRef, Sum, Subquery, Value

Statement.objects.annotate(
    sum=Subquery(
        Statement.objects.filter(
            pk__lte=OuterRef('pk')
        ).values(x=Value(0)).order_by('x').annotate(
            sum=Sum('amount')
        ).values('sum')[:1]
    )
)
从django.db.models导入OuterRef、Sum、子查询、Value
Statement.objects.annotate(
sum=子查询(
Statement.objects.filter(
pk\uu lte=OuterRef('pk')
).values(x=Value(0)).order_by('x')。注释(
总和=总和(“金额”)
).值('sum')[:1]
)

)
目前Django不支持子查询中的聚合,但通过一种变通方法,我们可以“欺骗”系统生成正确的查询:

from django.db.models import OuterRef, Sum, Subquery, Value

Statement.objects.annotate(
    sum=Subquery(
        Statement.objects.filter(
            pk__lte=OuterRef('pk')
        ).values(x=Value(0)).order_by('x').annotate(
            sum=Sum('amount')
        ).values('sum')[:1]
    )
)
从django.db.models导入OuterRef、Sum、子查询、Value
Statement.objects.annotate(
sum=子查询(
Statement.objects.filter(
pk\uu lte=OuterRef('pk')
).values(x=Value(0)).order_by('x')。注释(
总和=总和(“金额”)
).值('sum')[:1]
)

)
请共享相关模型。@WillemVanOnsem添加了模型并输出了我需要的内容,上面的Sql给出了相关的输出。请共享相关模型。@WillemVanOnsem添加了模型并输出了我需要的内容,上面的Sql给出了相关的输出。编程错误在/statement/non-integer常量处,按第1行排序:…“cashflow_statement”。“id”)按NULL顺序分组按NULL ASC…获取错误。如果我删除,
值(x=Value(None))。顺序按('x'))
之后,在每个语句中获得相同的
sum
值。因此它不会根据statements@NeerajKumar:这是
PostgreSQL
?@NeerajKumar:使用PostgreSQL,您可能需要传递一个int,删除值当然会产生相同的值,因为我们根据
Stateme的主键进行分组nt
对象。是的,在第1行的顺序中,/statement/非整数常量处出现PostgresqlProgrammingError:…“现金流_语句”。“id”)按空顺序分组按空顺序按空ASC。。。获取错误。如果我删除了,
Value(x=Value(None))。在这之后按('x')
排序,在每个语句中获得相同的
sum
值。所以它不是根据statements@NeerajKumar:这是
PostgreSQL
?@NeerajKumar:使用PostgreSQL,您可能需要传递一个int,删除值当然会产生相同的值,因为我们根据
语句
对象的主键进行分组。是的,它是PostgreSQL