2010-12-09 52 views
4

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

我已经研究过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] 

从理论上讲,它应该可以工作,但是我总是有一种微妙的感觉,认为这不是最好的办法。有没有更好的方法来做这样的事情?

回答

1

您的方法存在一个小问题。如果模型从代码中的其他地方更改会发生什么?您不想在任何地方泼这个历史跟踪代码。调查信号,这正是zobbo提到的django管理历史解决方案所使用的信号。