Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中实现交易和帐户系统?_Python_Django_Web - Fatal编程技术网

Python 如何在Django中实现交易和帐户系统?

Python 如何在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

我正在构建一个存储交易和账户的个人理财应用程序。每笔交易都会影响账户余额。我将如何在我的应用程序中实现这一点?我在网上搜索了一段时间,仍然没有找到具体的答案

models.py

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()