Преобразование SQL запроса в Django ORM - PullRequest
1 голос
/ 25 мая 2020

У меня есть запрос 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

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

В настоящее время Django не поддерживает агрегаты в подзапросах, но с помощью обходного пути мы можем «обмануть» систему в создании правильного запроса:

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

Statement.objects.annotate(
    sum=Subquery(
        Statement.objects.filter(
            <b>pk__lte=OuterRef('pk')</b>
        ).values(x=Value(0)).order_by('x').annotate(
            <b>sum=Sum('amount')</b>
        ).values('sum')[:1]
    )
)
0 голосов
/ 25 мая 2020
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)
...