使用 Django Model 类继承为表创建审计日志

Posted

技术标签:

【中文标题】使用 Django Model 类继承为表创建审计日志【英文标题】:Use Django Model class inheritance to create an audit log for a table 【发布时间】:2011-05-21 07:52:32 【问题描述】:

我想使用http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance 对现有模型进行子类化,以创建对原始表中任何记录所做的每次更改的完整历史记录。

Foo类: 数据 = 模型.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) 定义保存(): 极好的(...) 审计 = FooAuditLog.createFromFoo(self) 类 FooAuditLog(Foo): history_for = models.ForeignKey(Foo) def createFromFoo(foo): ... #从原始记录创建审计日志条目。

所以每次我创建或更新“Foo”类型的记录时,我都想拍摄 Foo 记录的快照并将另一个条目添加到 FooAuditLog 中。我的目标是为每条 Foo 记录提供完整的修订历史记录,以便我可以跟踪随着时间的推移对每条记录所做的每一次更改。

这种方法的缺陷是什么?如果与 Foo 之间存在 ForeignKey 关系,我是否需要担心 Foo 和 FooAuditLog 之间的级联删除/更新?

【问题讨论】:

你最后做了什么?我现在正在研究类似的解决方案。谢谢! 【参考方案1】:

为什么不使用诸如Audit Trail 应用程序之类的东西呢?我真的看不出继承如何真正适合日志记录所需的抽象。 Audit Trail 在类中使用一个简单的声明来打包所有的活动。

【讨论】:

【参考方案2】:

两种可能的预编码解决方案是 https://github.com/etianen/django-reversion 和 http://code.djangoproject.com/wiki/AuditTrail 。更多选项在https://www.djangopackages.com/grids/g/model-audit/

正如您所注意到的,外键引用很棘手,尤其是对于多对多模型。您必须确定旧模型是否是对新表的约束,否则会破坏那些使“撤消”相当复杂的关系。

【讨论】:

以上是关于使用 Django Model 类继承为表创建审计日志的主要内容,如果未能解决你的问题,请参考以下文章

Django中的model继承

从 ABC 和 django.db.models.Model 继承会引发元类异常

django model之Meta选项

Django Model Meta选项

Django模型

Django之Model类