2016-06-21 20 views
0

我試圖在更改字段時跟蹤更改。如何跟蹤在Django模型中使用update()時發生的更改

無論何時使用.save()方法,我都可以看到Django Admin History中的更改,但每當使用.update()方法時,它都不記錄我在對象中更改的內容。

我想使用update(),因爲它可以同時更改多個字段。這使得代碼更清潔,更高效的(一個查詢,一行...)

現在,我使用這個:

u = Userlist.objects.filter(username=user['username']).update(**user) 

我可以看到所有的變化,當我做

u = Userlist.objects.get(username=user['username']) 
u.lastname=lastname 
u.save() 

我還使用django-simple-history來查看changes.setup。

回答

0

docs

最後,實現update()在SQL級別做一個更新,並 因此,不叫上你的模型的任何save()方法,也不 發出pre_savepost_save信號(這是 因此呼籲Model.save()

update()作品在DB水平,因此Django管理當通過.update(...)應用更新時,無法跟蹤更改。

如果你仍然希望跟蹤更新的變化,你可以使用:

for user in Userlist.objects.filter(age__gt=40): 
    user.lastname = 'new name' 
    user.save() 

但是,這是更昂貴的,如果唯一的好處是跟蹤通過管理歷史的變化是不可取的。

+0

不幸的是,沒有一個裝飾器強迫這種行爲的信號... – mk2

+0

我還沒有遇到過任何。舊的黑客工程(請參閱我的更新),但不建議 –

+0

是的,我將列表中更改的字段存儲在列表中,然後迭代完成,然後逐個更改。最後我會保存新的對象。它的計算量更大一些,而且不夠清潔,但我需要跟蹤這些變化......謝謝,摩西。 – mk2