2012-02-06 33 views
0

我已經在這個問題上停了幾天。如何在對象狀態更新時執行特定操作?對django模型狀態修改執行操作

我有一個Order django模型與status字段。當訂單的狀態從newprocessed時,我需要執行一些特定的操作。

的事情是,狀態可以從任何地方更新:一個前端視圖,管理員模塊,批量操作,管理命令等

另外,我只希望以後要執行的動作訂單已保存。

看來post_save信號可以工作,但我找不到方法來檢測狀態是否已更改,以及舊值是什麼。

我檢查了django fsm, but it's clearly not the way to go

有什麼想法?

+0

你看看https://github.com/Atomidata/django-audit-log? – arie 2012-02-06 13:54:54

+0

似乎有點矯枉過正。 Plus«...它只能通過應用程序的Web界面跟蹤模型實例的更改。 » – 2012-02-06 14:56:04

回答

1

要檢測post_save信號中哪些字段發生了變化,您需要記住模型實例的原始狀態。 Actions triggered by field change in Django的一個答案正在考慮這一點,並指向Dirty fields in django,您可以在其中找到各種混合,這將允許您在保存模型時查找模型中的「髒」字段。

+0

是的,但據我瞭解,在批量更新的情況下沒有創建實例,因此髒域策略將無法正常工作,對吧? – 2012-02-06 14:31:07

+0

確實如此,'update'不會調用'save',也不會觸發信號(https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once)。您可以在自定義管理器中覆蓋'update'來執行您想要的操作,或者直接使用SQL處理更新,例如觸發器:http://dev.mysql.com/doc/refman/5.0/en/triggers.html(根本不涉及Django/Python)。 – 2012-02-06 17:26:24