假设:
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()方法将覆盖该实体。
答案 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()
请注意,该代码会将具有该名称的所有联系人更新为该电话号码。如果有多个名称,则两者都会更新。使用键名可以防止这种情况,但您必须创建更复杂的键,因为只有名字和姓氏可能会分开。