我正在学习Django,尝试使用会计应用程序跟踪我的费用等。
我用两个模型创建了数据库,一个用于帐户,一个用于操作。 但我不知道如何在每项操作中更新余额。
我想也许,每次保存新操作时,我都会通过覆盖Operation Model的保存方法来更新余额?但在这种情况下,如果我犯了一个错误并且必须删除一个操作,那么我的余额将不会更新,对吧?
我以为我还可以创建一个BalanceHistory模型,其中包含所有余额的历史记录,但在删除操作时会出现同样的问题。
我看到的最佳选择是每次想要显示它时动态更新我的余额,在那时添加所有操作..但我不知道我怎么能这样做..
因此,如果有人对此有所了解,那就太棒了。 我知道这不是一个纯粹与Django相关的问题,但是当我使用Django时,如果我能找到一个使用Django功能的想法会更好!
提前感谢您的时间和帮助!
答案 0 :(得分:3)
你是对的,这很棘手 - 没有办法保证准确的平衡,除非根据帐户的整个历史记录在每次读取时动态计算它。
如果您选择这样,您可以使用Django ORM的aggregation features来计算操作的总和。例如,如果您的操作有一个名为amount
的字段(正数或负数表示该操作的余额变化),您可以计算余额,如:
Operation.objects.filter(account=my_account).aggregate(balance=Sum('amount'))
如果您出于某种原因不想这样做,您还可以使用自定义save
方法维护运行余额,如您所述。您可以使用delete
method之类的save
来处理单个项目删除。
但是,如果您曾经使用批量插入,更新或删除或原始SQL操作,那么该方法将导致问题,因为这些方法不会调用save
和delete
方法。但是,如果您需要使用这些功能,则可以使用混合方法 - 在执行一次性事务时使用save
和delete
选项,并定期触发带有聚合的完全重新计算为了解决错误或在做完手术后立即搞砸了。