Python 如何在Django中实现交易和帐户系统?
我正在构建一个存储交易和账户的个人理财应用程序。每笔交易都会影响账户余额。我将如何在我的应用程序中实现这一点?我在网上搜索了一段时间,仍然没有找到具体的答案 models.pyPython 如何在Django中实现交易和帐户系统?,python,django,web,Python,Django,Web,我正在构建一个存储交易和账户的个人理财应用程序。每笔交易都会影响账户余额。我将如何在我的应用程序中实现这一点?我在网上搜索了一段时间,仍然没有找到具体的答案 models.py class Account(models.Model): DateCreated = models.DateTimeField() AccountName = models.SlugField(max_length= 100, primary_key=True) UserID = models.F
class Account(models.Model):
DateCreated = models.DateTimeField()
AccountName = models.SlugField(max_length= 100, primary_key=True)
UserID = models.ForeignKey(MyUser, on_delete=models.CASCADE)
Type = models.CharField(max_length= 20)
Balance = models.DecimalField(max_digits=19, decimal_places=8)
Value = models.DecimalField(max_digits=19, decimal_places=8)
class Transaction(models.Model):
TypeChoices = (
('Income', 'Income'),
('Expense', 'Expense'),
('Transfer', 'Transfer'),
)
CategoryChoices = (
('Rent', 'Rent'),
('Utilities', 'Utilities'),
('Food', 'Food'),
('Leisure', 'Leisure'),
('Insurance', 'Insurance'),
('Gas', 'Gas'),
('Savings', 'Savings'),
('Investment', 'Investment'),
('Phone Payment', 'Phone Payment'),
('Gym Payment','Gym Payment'),
('Salary', 'Salary'),
('Asset', 'Asset'),
('Miscellaneous', 'Miscellaneous'),
('Transfer', 'Transfer'),
)
AccountName = models.ForeignKey(Account, on_delete=models.CASCADE)
UserID = models.ForeignKey(MyUser, on_delete=models.CASCADE)
Date = models.DateField()
Type = models.CharField(max_length = 8, choices = TypeChoices)
Entity = models.CharField(max_length = 100)
Description = models.CharField(max_length = 200)
BudgetType = models.CharField(max_length = 20, choices = CategoryChoices)
Amount = models.DecimalField(max_digits=19, decimal_places=8)
我目前创建的视图允许用户创建、更新和删除交易和账户,但不会影响账户余额的交易。实现这一点的最佳方法是什么?您可以在事务模型中使用以下代码 (我测试了一下) 此功能将在删除对象之前减少余额中的金额
def delete(self, *args, **kwargs):
self.AccountName.Balance -= self.Amount
self.AccountName.save()
super(Transaction, self).delete(*args, **kwargs)
如果您想在更新金额后更改余额,可以使用以下信号:
@receiver(pre_save, sender=Transaction)
def update_balance_account(sender, instance, update_fields=None, **kwargs):
trans = Transaction.objects.get(AccountName=instance.AccountName, id=instance.id, UserID=instance.UserID)
instance.AccountName.Balance -= trans.Amount
instance.AccountName.save()
也许您可以在模型的
save()
方法中更改用户的平衡?我认为这可能是一个答案。。因此,也许我可以使用aggregate sum()对交易进行求和,并以这种方式保存余额?谢谢,这是一个有用的开始!这适用于将交易添加到帐户余额,但在删除交易时不会更新帐户。您可以重载其他方法或创建一个信号post\u delete别担心,我会帮您确定谢谢!我当前正在尝试覆盖帐户模型中的save方法。然后汇总每笔交易的金额(sum(‘Amount’),这样账户将成为交易金额的结果。这样,帐户就可以正确地进行事务添加、删除和更新。这是正确的方法吗?如果您想在更新金额后更改余额,我认为这是不合适的。您可以为TransactionOk编写一个预保存方法,以便预保存在现有事务上工作,但当我创建一个新事务时,我得到一个错误,即“事务匹配查询不存在”它反映在账户余额中,但不保存交易。
@receiver(pre_save, sender=Transaction)
def update_balance_account(sender, instance, update_fields=None, **kwargs):
trans = Transaction.objects.get(AccountName=instance.AccountName, id=instance.id, UserID=instance.UserID)
instance.AccountName.Balance -= trans.Amount
instance.AccountName.save()