Текущий баланс Django / Накопительный баланс

#python #django #django-models

#python #django #django-модели

Вопрос:

У меня есть модель транзакции с функцией для вычисления баланса (текущий баланс / накопительный баланс), но вывод баланса возвращается в виде набора запросов.

<Набор запросов [{‘id’: 1, ‘cumsum’: -9.0}, {‘id’: 2, ‘cumsum’: -16.0},{‘id’: 3, ‘cumsum’: -21.0}]>

как мне исправить мою функцию, чтобы баланс отображал только такие числа, чтобы 16 октября было равно -9,00, 18 октября -16,00, затем 20 октября -21,00. Заранее благодарю вас.

model.py

 class Transaction(models.Model):
    transaction_date = models.DateField()
    account_nickname = models.ForeignKey(Accounts, on_delete=models.CASCADE)
    amount = models.FloatField()

    @property
    def balance(self):
        return Transaction.objects.annotate(cumsum=Func(Sum('amount'),template='%(expressions)s OVER (ORDER BY %(order_by)s)',order_by="id")).values('id', 'cumsum').order_by('id', 'cumsum')
  

views.py

 def index(request):
    all_transactions = Transaction.objects.all()
    context = {
        "transactions": all_transactions
    }
    return render(request,'pages/index.html', context)
  

index.html

         {% for each_transaction in transactions %}
        <tr>
            <td>{{each_transaction.transaction_date}}</td>
            <td>{{each_transaction.account_nickname}}</td>
            <td>{{each_transaction.amount}}</td>
            <td>{{each_transaction.balance}}</td>
        </tr>
        {% endfor %}
  

Вывод:
введите описание изображения здесь

Ответ №1:

Сначала удалите вашу @property balance функцию

затем в views.py

 def index(request):
    all_transactions = Transaction.objects.annotate(cumsum=Func(Sum('amount'),template='%(expressions)s OVER (ORDER BY %(order_by)s)',order_by="id"))
    context = {
        "transactions": all_transactions
    }
    return render(request,'pages/index.html', context)
  

Затем в вашем index.html

 {% for each_transaction in transactions %}
<tr>
    <td>{{each_transaction.transaction_date}}</td>
    <td>{{each_transaction.account_nickname}}</td>
    <td>{{each_transaction.amount}}</td>
    <td>{{each_transaction.cumsum}}</td>
</tr>
{% endfor %}