我想使用http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance子类化现有模型,以便创建对原始表中任何记录所做的每个更改的完整历史记录 .
class Foo:
data = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def save():
super(...)
audit = FooAuditLog.createFromFoo(self)
class FooAuditLog(Foo):
history_for = models.ForeignKey(Foo)
def createFromFoo(foo):
... #Create the auditlog entry from the original record.
因此,每次创建或更新“Foo”类型的记录时,我都想拍摄Foo记录的快照,并在FooAuditLog中添加另一个条目 . 我的目标是为每个Foo记录提供完整的修订历史记录,以便我可以跟踪每个记录随时间的每个变化 .
这种方法的缺陷是什么?如果与Foo之间存在ForeignKey关系,我是否必须担心Foo和FooAuditLog之间的级联删除/更新?
2 回答
为什么不使用诸如Audit Trail应用程序之类的东西?我无法真正看到继承如何真正适合日志记录所需的抽象 . Audit Trail在类中使用一个简单的声明来打包所有活动 .
两种可能的预编码解决方案是https://github.com/etianen/django-reversion和http://code.djangoproject.com/wiki/AuditTrail . 更多选项在https://www.djangopackages.com/grids/g/model-audit/
如您所知,外键引用很棘手,特别是对于多对多模型 . 您必须确定旧模型是否是新表的约束,否则会破坏那些使“撤消”变得相当复杂的关系 .