在django中创建“历史”类型模型的最佳方法是什么?

时间:2009-11-17 23:23:03

标签: database django database-design django-models

我想为我的Django应用程序创建一个类似于Django admin的“Recent Actions”的功能,以便将历史信息存储在我的其他模型中。

例如说我有两个名为Book and Author的模型。我希望有第三个模型来存储信息,例如对模型中的给定对象执行的操作(添加,修改,删除等)由谁和何时执行。

谁,何时以及行动都很简单,我只是不确定如何存储有关执行操作的对象的信息。

我最初的想法是拥有一个存储此信息的“交易”模型,我的Book和Author模型都可以与之建立ForeignKey关系。但是,如果我删除了给定的书或作者,那么它的事务历史记录也会被删除,而且我没有记录该对象确实被删除了。

我一直在考虑其他可能的解决方案,但我想我首先会在这里要求更多有经验的意见。我应该如何处理这个问题以及它有什么合理的解决方案呢?

谢谢!

3 个答案:

答案 0 :(得分:5)

您可能想要查看django-reversion - 要么实施,要么从中学习以实现自己的实施。 Django reversion通过保存有关更改的信息以及该时刻存在的项目的序列化副本来工作。这意味着您以后可以回忆起一个特定的项目,并进行比较或修复等等。

如果您决定实施自己的自定义解决方案,我建议您使用内置signal sub-system的Django。开箱即用的Django为您提到的内容提供了常见的信号,如模型创建,保存和删除。如果您发现需要,也可以添加自定义信号。

使用信号将允许您开发与书籍/作者实施代码分开的“历史”代码,从长远来看,这将是一种资产(而不是在整个书/作者代码中对历史代码进行串联)。再次,django-reversion通过几乎完全用信号完成其工作,在此作为一个很好的参考。

答案 1 :(得分:1)

恕我直言,最好的解决方案是由Marty Alchin在他的Pro Django书中开发的,不幸的是要花钱,但幸运的是,这本书值得一试。

他的审计线索的早期版本可以在AuditTrail的Django wiki上找到,但我不确定这段代码在最新版本的Django中的效果如何。

答案 2 :(得分:0)

您还可以尝试fullhistory来管理管理界面之外的更改。 我在测试时遇到了一些问题,但它可能适合你。