2013-04-03 45 views
3

尋找一種有效的方法來檢查db.Model的特定屬性是否已更改,而不是putting之前存儲在數據存儲中的版本。顯然,我想避免從數據庫中獲得新的實例!可能嗎?事情是這樣的:檢測實體的特定屬性是否在「放置」實體時發生了變化?

class MyClass(db.Model): 
    prop = db.StringProperty() 

instance = MyClass() 
instance.string_property = 'string' 
instance.put() 

instance2 = db.get(instance.key()) 
instance2.string_property = 'string2' 

instance2.put() #would like to detect that string_property was altered! 

回答

0

我知道這僅僅是一個基本的Python編程問題:

class MyClass(): 
    prop = 'init string' 

    def __setattr__(self, name, value): 
     print name + ' is being updated to ' + value 

    test = MyClass() 
    test.prop = 'summing else' 

    prop is being updated to summing else 
+0

我認爲這是一個壞主意。如果你看看db的代碼(你現在真的應該使用ndb),那麼每個屬性/模型都有很多內容(元類在這裏被大量使用),並且取決於類/屬性和/或值被分配你可能會開始得到一些真正奇怪的行爲和/或錯誤。你應該考慮使用鉤子(一些想法http://blog.notdot.net/2010/04/Pre-and-post--put-hooks-for-Datastore-models)或切換到ndb並使用它的前/後鉤。 –

+0

我在這個模型上使用鉤子 - 我將如何使用它們來檢測特定屬性的更新? – HorseloverFat

+0

@蒂姆霍夫曼 - 如果你用Nick的博客作出答案,可以使用Nick的博客,這可能是我接受的解決方案,我認爲:-) – HorseloverFat

2

我認爲是一個壞主意。

如果你看看db的代碼(你現在真的應該使用ndb),那麼每個屬性/模型(元類在這裏大量使用)都有很多內容,並且取決於類/財產和/或價值被分配你可能會開始得到一些真正奇怪的行爲和/或錯誤。

這並不意味着你應該,但是考慮你仔細做什麼;-)

我會考慮或者使用鉤子(SE尼克約翰遜博客的一些想法blog.notdot.net/2010/04/ ...)或切換到ndb並使用它的前/後掛鉤(請參閱模型掛鉤https://developers.google.com/appengine/docs/python/ndb/entities#hooks

+0

我到底會如何使用鉤子來完成這個任務? – HorseloverFat

+2

一種方法是使用定義一個post_get鉤子(讀者的另一個練習,或使用已獲得鉤子的ndb)當您檢索實體時,將屬性值或校驗和存儲在非持久化實例變量中。然後,當你開始使用pre_put鉤子來檢查什麼值已經改變或者是否有任何改變,並且在放置之前執行你所需要的任何通知。 –

+0

這也比setattr更重要,因爲在最終投入前理論上的價值可能會改變幾次,最終回到原始價值,因此不需要通知;-)或發送多個通知。例如使用整數屬性,並在循環中不斷添加一些值。 –

相關問題