【问题标题】:What's the best way to create a 'history' type model in django?在 django 中创建“历史”类型模型的最佳方法是什么?
【发布时间】:2010-12-17 16:16:31
【问题描述】:

我想为我的 Django 应用程序创建一个类似于 Django 管理员的“最近操作”的功能,以便在我的其他模型上存储历史信息。

例如,假设我有两个模型,分别称为 Book 和 Author。我想要第三个模型来存储信息,例如由谁和何时对模型中给定对象执行的操作(添加、修改、删除等)。

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

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

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

谢谢!

【问题讨论】:

    标签: database django database-design django-models


    【解决方案1】:

    您可能想查看django-reversion - 实施或学习它以用于您自己的实施。 Django reversion 通过保存有关更改的信息以及当时存在的项目的序列化副本来工作。这意味着您以后可以回忆起该特定项目并进行比较或恢复或其他操作。

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

    使用信号可以让您开发与 Book/Author 实现代码分开的“历史”代码,从长远来看,这将是一种资产(而不是在整个 Book/Author 代码中串起历史代码)。再次,django-reversion 在这里作为一个很好的参考,它几乎完全使用信号来完成它的工作。

    【讨论】:

    • 谢谢,这真的很有帮助。 django-revision 似乎无法满足我的需求,但信号系统真的会帮助我。
    【解决方案2】:

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

    可以在 Django wiki AuditTrail 上找到他的审计跟踪的早期版本,但我不确定这段代码在最新版本的 Django 中的运行情况如何。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 2017-12-16
        相关资源
        最近更新 更多