记录项值更改为Django对象

时间:2010-12-09 04:37:29

标签: django django-models django-forms

目前我正在考虑如何最好地在模型上实现变更记录,以便为对象提供某种形式的审计跟踪。

我研究过django-reversion,并且在某种程度上它完成了我需要做的事情,但是我的需求比这更简单。我只想要能够记录哪个用户更改了对象上的哪个字段的内容,以及提交更改之前字段的先前值。

存储这个的简单类就像:

class AuditLogEntry(models.Model):
    user = ForeignKey(User, verbose_name=_(u"user"), related_name="actions")
    obj = ForeignKey(ModelToLog, verbose_name=_(u"Model"), related_name="history")
    timestamp = DateTimeField(default=datetime.now)
    field = models.CharField(max_length=64)
    value = models.CharField(max_length=256)

目前我只想在视图处理程序中添加一个代码块,用以下内容更新模型:

form = ModelToLogForm(request.POST, instance=obj)
prev_data = dict()
for changed_field in form.changed_data:
    prev_data[changed_field] = form.instance.get_attribute(changed_field)
if form.is_valid():
    form.save()
    for changed_field in keys(prev_data):
        obj.history.create(user=request.user, obj=obj, field=changed_field, value=prev_data[changed_field]

从理论上讲,它应该有效,但我仍然觉得这不是最好的方法。有没有更好的方法来做这样的事情?

2 个答案:

答案 0 :(得分:3)

你想要做的基本上就是Django自己的管理历史。阅读Tying in to Django Admin's Model History(也许你可以直接使用它)并查看它背后的源代码(如果你想借用它的方法)。

答案 1 :(得分:2)

您的方法存在一个小问题。如果从代码中的其他地方更改模型会发生什么?您不希望在任何地方都使用此历史记录跟踪代码。调查信号,这是dobang管理员历史解决方案使用的,如zobbo所述。