我有一個數據庫模型正在根據遠程數據(通過HTML刮板)的更改進行更新。在Django調用保存之前檢測模型是否已更改
我想保持一個字段名爲changed
- 時間戳表示當最後一次,模型的價值從他們以前改變了(注意,這是auto_now
不同,因爲這些領域的每一個模型的save
方法被調用時更新)。
這裏是我的問題:
在模型的save
方法,有沒有檢測一個模型實例的當前值是從數據庫中的值不同的一個簡單的方法?或者,有沒有其他方法可以輕鬆維護changed
時間戳?
我有一個數據庫模型正在根據遠程數據(通過HTML刮板)的更改進行更新。在Django調用保存之前檢測模型是否已更改
我想保持一個字段名爲changed
- 時間戳表示當最後一次,模型的價值從他們以前改變了(注意,這是auto_now
不同,因爲這些領域的每一個模型的save
方法被調用時更新)。
這裏是我的問題:
在模型的save
方法,有沒有檢測一個模型實例的當前值是從數據庫中的值不同的一個簡單的方法?或者,有沒有其他方法可以輕鬆維護changed
時間戳?
在github上:https://github.com/smn/django-dirtyfields/ – philfreo 2012-03-19 21:45:34
聽起來好像是你想要的是信號:http://docs.djangoproject.com/en/1.2/topics/signals/
你可以使用一個post_save
信號更新相關領域的另一種模式來存儲以前的值。然後在下一個回頭你會有一些比較。
您可能會嘗試在保存記錄值時計算校驗和。然後,當您稍後閱讀它時,請重新計算校驗和,看看它是否已更改。也許crc32
函數在Python zlib
標準模塊中。 (我不知道這會有什麼樣的表現。所以,你可能需要調查。)在一個Django模型實例
有趣。有沒有簡單的方法來查看整個對象的數據,以便它可以很容易地校驗和?有可能兩個相同(具有相同字段值)的對象實例具有不同的「數據」(輸入由我們的校驗和函數讀取)。 – advait 2011-03-09 07:25:17
1.我會使用的方法是簡單地獲取所有字段數據,將每個字段數據轉換爲字符串,並將其全部連接起來,然後進行校驗和。 2.理論上可能有兩個具有不同數據的實例提供相同的校驗和,但這是不太可能的。如果你真的擔心這一點,你可以使用一個密碼散列函數,其中幾乎不可能;但計算起來會更昂貴。 – dappawit 2011-03-09 19:52:34
@dappawit你應該考慮連接的順序,這可能會導致你的邏輯問題。散列(「a = 1b = 2c = 3」)!=散列(「a = 1c = 3b = 2」)。無論如何,另一個好方法。 – Chris 2013-06-27 20:05:02
如果通過表單保存實例,則可以檢查form.has_changed()
。
如果你想知道哪個字段發生了變化:'form.changed_data' – 2012-06-10 06:46:22
謝謝,需要這兩個:) – Lee 2012-11-28 11:21:44
此庫有跟蹤FK查找。
有沒有人有'django-extensions'的經驗?他們有一個'TimeStampedModel'類,可以做我正在尋找的東西,但文檔不是很有幫助(http://packages.python.org/django-extensions/model_extensions.html) – advait 2011-03-09 02:43:20