django – 在复式会计应用程序中确保平衡交易的最佳方法是什么?

什么是确保交易总是在复式会计中平衡的最佳方法?

我正在Django创建一个复式会计应用程序.我有这些模型:

class Account(models.Model):
    TYPE_CHOICES = (
        ('asset', 'Asset'),
        ('liability', 'Liability'),
        ('equity', 'Equity'),
        ('revenue', 'Revenue'),
        ('expense', 'Expense'),
    )

    num = models.IntegerField()
    type = models.CharField(max_length=20, choices=TYPE_CHOICES, blank=False)
    description = models.CharField(max_length=1000)


class Transaction(models.Model):
    date = models.DateField()
    description = models.CharField(max_length=1000)
    notes = models.CharField(max_length=1000, blank=True)


class Entry(models.Model):
    TYPE_CHOICES = (
        ('debit', 'Debit'),
        ('credit', 'Credit'),
    )

    transaction = models.ForeignKey(Transaction, related_name='entries')
    type = models.CharField(max_length=10, choices=TYPE_CHOICES, blank=False)
    account = models.ForeignKey(Account, related_name='entries')
    amount = models.DecimalField(max_digits=11, decimal_places=2)

我想在模型级别强制执行平衡事务,但似乎没有在正确的位置挂钩.例如,Transaction.clean将无法工作,因为事务先被保存,然后由于Entry.transaction ForeignKey而添加了条目.

我想平衡检查也可以在管理员中工作.目前,我使用带有干净方法的EntryInlineFormSet来检查管理中的余额,但这在从脚本添加事务时没有帮助.我愿意改变我的模型以使其更容易.

最佳答案
这可能听起来非常幼稚,但为什么不将每个事务记录在包含“to account”和“from account”的单个记录中,这些外键链接到一个帐户表而不是为每个事务创建两个记录?从我的观点来看,似乎“复式”的本质是交易总是将钱从一个账户转移到另一个账户.使用两个记录来存储此类事务并存在许多缺点是没有优势的.

转载注明原文:django – 在复式会计应用程序中确保平衡交易的最佳方法是什么? - 代码日志