2009-11-17 89 views
2

我想为我的Django应用程序创建一个功能,类似于Django admin的'Recent Actions',以便将历史信息存储在其他模型上。在django中创建“历史”类型模型的最佳方式是什么?

例如说我有两个模型叫书和作者。我想要第三个模型存储信息,例如在模型中的某个给定对象上执行什么操作(添加,修改,删除等等)。

谁,何时,动作很简单,我只是不知道如何来存储关于其上执行动作什么对象的信息。

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

我一直在想其他可能的解决方案,但我想我会先在这里要求更多有经验的观点。我应该如何处理这个问题,以及对此有什么合理的解决方案?

谢谢!

回答

4

你可能想看看django-reversion - 无论是执行或从中学习为自己的实现。 Django版本通过保存有关更改的信息,以及该项目在该时刻存在的序列化副本来工作。这意味着你以后可以回想一个特定的项目并做一个比较或修复或其他任何事情。

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

使用信号将允许您开发独立于书/作者实现代码的“历史”代码,从长远来看,这将成为一项资产(而不是整个书籍/作者代码中的串行历史代码)。 django-reversion再次作为一个很好的参考,几乎完全是通过信号来完成它的工作。

+0

谢谢,这真的很有帮助。 Django修订似乎对我的需求太多了,但信号系统真的会帮助我。 – hora 2009-11-20 02:39:37

0

您也可以尝试fullhistory该管理管理inteface之外的变化。 我在测试时遇到了一些问题,但它可能适用于您。

1

恕我直言,最好的解决办法是由马蒂Alchin在他的书中Pro Django开发的一个不幸的成本钱,但幸运的是,是一本值得去反正。

他的审计跟踪的早期版本可以在Django维基上找到AuditTrail,但我不确定此代码在最新版本的Django中的工作效果如何。

相关问题