在 django 中为模型创造完整历史的最佳方法是啥?

Posted

技术标签:

【中文标题】在 django 中为模型创造完整历史的最佳方法是啥?【英文标题】:what its the best way to make full history for a model in django?在 django 中为模型创造完整历史的最佳方法是什么? 【发布时间】:2018-10-06 08:52:29 【问题描述】:

如何为在字段中显示旧值和新更改值的模型创建历史记录?

在我看来,我认为为每个具有相同字段的模型创建历史模型,并且当用户从第一个模型创建新数据或更新数据时,也会转到第二个模型。

我搜索了很多这个问题,我发现了一个名为 django-reversion 的数据包,但我不明白如何让它存储旧值和新值,如果有人可以帮助我解决这个问题,请告诉我。

【问题讨论】:

【参考方案1】:

为此,您可以使用simple-history app

您的实例的每次更改都会反映在历史表中。每次更改都会有带有新值的新行。这样您就可以重现每个字段的所有旧值。

【讨论】:

简单历史会保存旧值和新值吗?? 实例的每一次变化都会反映在历史表中。每次更改都会有带有新值的新行。这样您就可以重现每个字段的所有旧值。 酷好吧,我会尝试它..如果这个扩展真的这样做..这将是我搜索的内容..我会尝试并回答你..谢谢你【参考方案2】:

在this link 中有一个可用于模型审计/历史记录的不同包的比较。

我使用django-simple-history,它带有一个很好的集成来查看管理员中每个模型实例的更改列表。

至少对于我的用例,django-simple-history 为我提供了我需要的东西,到目前为止我没有遇到任何问题。


编辑:只是一个附加说明

这个包跟踪ManyToManyField的历史记录。

另请参阅以下相关问题:

    How can I store history of ManyToManyField using django-simple-history. History of a ManyToManyField in django-simple-history

还有 Github 问题:

    https://github.com/treyhunner/django-simple-history/issues/16

【讨论】:

但我认为 django 简单历史记录只是通知您更改了哪个字段但不存储该字段中更改的旧值.. @AhmedOthmanMohamedNazim 不正确:此扩展会创建模型的副本(进行新的迁移以创建新表)并存储所有旧值。此外,它还存储模型每个实例的更改的用户和日期时间。 另外:如果您将字段添加到模型中,历史表也将被更改以添加该新字段。 酷好吧,我会尝试它..如果这个扩展真的这样做..这将是我搜索的内容..我会尝试并回答你..谢谢你 @AhmedOthmanMohamedNazim 我编辑了我的答案以包含有关ManyToManyField的信息【参考方案3】:

可能有一个干净的库可以满足您的所有需求,我只是不知道。

解决这个问题的方法是覆盖模型保存功能。您可以参考this prior *** post 了解正在发生的事情的要点。通过这种方式,您可以指定要为其应用内存的模型类/ sql 表。然后添加到自定义保存方法中,在新的变更日志模型类中新建一行。

【讨论】:

以上是关于在 django 中为模型创造完整历史的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中为 Selenium 测试加载夹具时出现完整性错误

在基于 Django 的 GraphQL API 中为 postgres 表创建全局搜索字段的最佳方法?

将 Django 模型中的保存方法覆盖为使用 celery 异步的最佳实践

在 Django 中使用更多字段扩展用户模型的最佳方法是啥?

向 Django Auth User 模型添加便利方法的最佳方法?

Django:对抽象模型进行单元测试的最佳方法