2011-04-20 43 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() 

注意,该代码将更新与名称到电话号码的任何联系人。如果有多个名称,则两者都会更新。使用键名可以防止这种情况发生,但是由于只有第一个和最后一个名字可能会混淆,所以您必须创建更复杂的键。

相关问题