Рекомендуемый способ отображения баланса на банковском счете в шаблоне django - PullRequest
0 голосов
/ 12 октября 2019

В Django у меня есть модель, где я регистрирую транзакцию (дата, сумма, поля описания). На мой взгляд, я хотел бы показать текущий баланс, что-то вроде этого:

Date       | Description | Amount | Balance
----------------------------------------------
2019-01-01 | Item 1      | $100   | $100
2019-01-02 | Item 2      | -$10   | $90
2019-01-03 | Item 3      | $200   | $290
2019-01-04 | Item 4      | $10    | $300

Теперь проблема в том, что BALANCE, конечно, должен быть рассчитан путем суммирования предыдущего баланса и текущей транзакции. Для меня, кажется, имеет смысл сделать этот расчет внутри представления. Я не знал бы другого разумного способа поместить это где-нибудь еще. Это верно? Если так, каков наилучший способ сделать это? Если нет, то как правильно это сделать?

class Transaction(models.Model):
    date = models.DateField()
    amount = models.DecimalField(max_digits=15, decimal_places=2)
    account = models.ForeignKey(BankAccount, on_delete=models.CASCADE)
    description = models.TextField(null=True, blank=True)

На мой взгляд:

transactions = Transaction.objects.filter(account__id=100).order_by("date")

1 Ответ

1 голос
/ 12 октября 2019

Вы можете достичь этого с помощью cumsum. Ради простоты я разделил логику.

from django.db.models import Window, Sum, F
from django.db.models.functions import Lead

transactions = Transaction.objects.filter(account__id=100).annotate(
    #This will add up 'cumulative_amount' to your instances
    cumulative_amount=Window(Sum('amount'), order_by=F('date').asc())
    #We're now shifting `cumulative_amount`starting with default value
    balance = Lead(expression = 'cumulative_amount', offset=1, default=F('your_default_value')))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...