2011-04-20 47 views
2

假設:GAE數據存儲 - 用於更新實體的解決方法?

class Contacts(db.Model): 
    first_name = StringProperty() 
    last_name = StringProperty() 
    phone_number = PhoneNumberProperty() 

new_contact = Contacts(first_name="Homer", last_name="Simpson", phone_number = 1234566) 
new_contact.put() 

我是新來的GAE數據存儲,但每個GAE數據存儲文件(見下面如果有興趣),我不能修改的實體(例如,PHONE_NUMBER)的一個屬性。我必須重新聲明所有屬性,然後放置()新的實體。忽略來自新實體的先前聲明的屬性導致它們被聲明爲無。是否有解決方法 - 例如手動覆蓋密鑰名稱生成函數 - 因此實體保持相同的密鑰?

從GAE數據存儲文檔: 要更新現有的實體,修改對象的屬性,然後調用put()方法。對象數據覆蓋現有的實體。每次調用put()時,整個對象都會發送到數據存儲區。注意:數據存儲區API不區分創建新實體和更新現有實體。如果對象的鍵代表一個存在的實體,調用它的put()方法將覆蓋該實體。

+0

找到解決方案 - 需要在創建實體時手動設置鍵名,然後在更改實體的屬性後重新聲明相同的鍵名 - ASSUME:new_contact = Contacts(key_name ='homerjsimpson',first_name ='homer',last_name = 'simpson',phone_number = 123456).put()TO UPDATE phone_number-- new_contact = Contacts(key_name ='homerjsimpson',first_name ='homer',last_name ='simpson',phone_number = 999999999)。不會創建新的實體 – 2011-04-20 21:41:47

回答

0

這是不正確的。你需要有一種方法來獲得你想要的聯繫方式,你可以更新。使用鍵名只是一種方法。如果你知道過濾一個查詢的ID只能得到一個實體,你可以更新它的一個字段和put()來更新它。

你可能有這樣的事情:

query = Contact.all().filter('first_name', 'john').filter('last_name', 'doe') 
for contact in query: 
    contact.phone_number = 498340594834 
    contact.put() 

注意,該代碼將更新與名稱到電話號碼的任何聯繫人。如果有多個名稱,則兩者都會更新。使用鍵名可以防止這種情況發生,但是由於只有第一個和最後一個名字可能會混淆,所以您必須創建更復雜的鍵。