【问题标题】:Convert SQL query into Django ORM将 SQL 查询转换为 Django ORM
【发布时间】:2020-09-12 02:09:31
【问题描述】:

我有 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

编辑: Django 模型

class Statement(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    date = models.DateField()

    def __str__(self):
        return self.title

输入数据

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

【问题讨论】:

  • 请分享相关模型。
  • @WillemVanOnsem 添加了模型并输出我需要的东西,上面的 Sql 给出了相关的输出。

标签: sql django postgresql django-models django-orm


【解决方案1】:
x=Statement.objects.filter(date='your date')
sum=0
for i in x:
   sum+=x.amount

也许我的代码有错误,但我认为您正在寻找 .filter() 部分。如果您需要同时使用多个过滤器,可以这样想:

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

【讨论】:

    【解决方案2】:

    目前 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]
        )
    )

    【讨论】:

    • ProgrammingError at /statement/ non-integer constant in ORDER BY LINE 1: ..."cashflow_statement"."id") GROUP BY NULL ORDER BY NULL ASC ... 出现错误。如果我删除了values(x=Value(None)).order_by('x'),则在每个语句中获得相同的sum 值。所以它不会根据语句更新
    • @NeerajKumar: 这是PostgreSQL?
    • @NeerajKumar:使用 PostgreSQL,您可能需要传递一个 int,并且删除值当然会产生相同的值,从那时起我们 GROUP BY Statement 对象的主键。跨度>
    • 是的,它是 Postgresql
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2021-07-06
    • 2022-08-18
    • 2019-10-17
    • 2019-06-11
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多