[Answered ]-Updating account balance with django

1👍

considered balance change will be trigger by expense record change, you can overwrite save on Expense model. then balance table can be maintain in auto.

import datetime

class Expense(models.Model):
    date = models.DateTimeField(default=timezone.now)
    spender = models.ForeignKey('auth.User')
    description = models.CharField(max_length=200)
    category = models.ForeignKey(Category,default=1)
    ABN = 'ABN'
    ING = 'ING'
    ACCOUNT_CHOICES = (
        (ABN, 'ABN'),
        (ING, 'ING'),
    )
    account = models.CharField(
        max_length=30,
        choices=ACCOUNT_CHOICES,
        default=ABN,
    )
    amount = models.DecimalField(max_digits=10, decimal_places=2)


    def save(self, *args, **kwargs):
        super(Expense, self).save(*args, **kwargs)
        last_bal = Balance.objects.order_by('id').last()
        Balance.objects.create(date=datetime.datetime.now(), previouse_balance=last_bal.current_balance,
                               transaction=self, current_balance=last_bal.current_balance + self.amount)
👤xyzone

1👍

If I’m understanding your question correctly, you want to be able to get your current balance after creating Expenses. If so, you can use Django’s aggregation:

from django.db.models import Sum

class Balance(models.Model):
   date = models.DateTimeField(default=timezone.now)
   # Keep the amount you start with
   starting_balance = models.IntegerField()

   # Get the Sum of all expenses and do some simple subtraction
   def get_current_balance(self):
       total_expenses = Expense.objects.all().aggregate(Sum('amount'))
       return self.starting_balance - total_expenses['amount__sum']

Then in your views, you can do something like:

current_balance = some_balance_instance.get_current_balance()

Leave a comment