2010-12-09 84 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管理歷史解決方案所使用的信號。