GAE数据存储 - 更新实体的解决方法?

时间:2011-04-20 20:34:59

标签: google-cloud-datastore

假设:

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)。我必须重新声明所有属性,然后将()放入新实体。从新实体中省略先前声明的属性会导致它们被声明为None。是否有解决方法 - 例如手动覆盖密钥名称生成功能 - 以便实体保持相同的密钥?

# 来自GAE Datastore Docs的

要更新现有实体,请修改对象的属性,然后调用put()方法。对象数据会覆盖现有实体。每次调用put()时,整个对象都会被发送到数据存储区。注意:数据存储区API不区分创建新实体和更新现有实体。如果对象的键表示存在的实体,则调用其put()方法将覆盖该实体。

1 个答案:

答案 0 :(得分:0)

那不是真的。你需要有办法获得你想要的联系,你可以更新。使用keyname只是一种方法。如果您知道过滤查询的ID只能获取一个实体,则可以从中更新字段,并使用put()更新它。

你可以拥有类似的东西:

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

请注意,该代码会将具有该名称的所有联系人更新为该电话号码。如果有多个名称,则两者都会更新。使用键名可以防止这种情况,但您必须创建更复杂的键,因为只有名字和姓氏可能会分开。