【问题标题】:Partly update App Engine entity部分更新 App Engine 实体
【发布时间】:2012-08-22 17:29:04
【问题描述】:
我正在使用 App Engine 构建一个同步引擎,当我从客户端接收数据时,我想存储一个对象,但我不在乎它是否已经存在。如果我在更新时总是从客户端发送所有属性,那么今天效果很好。但我想要...
- 客户端不知道的一些内部属性在更新后仍然存在
- 客户端只能发送更改后的值
- 避免在更新之前获取所有对象,因为可能需要更新的对象很少
我是否需要获取每个对象,然后只更新我想要更改的值,然后再更新对象?或者是否可以部分更新实体而不获取它们?
【问题讨论】:
标签:
python
google-app-engine
google-cloud-datastore
app-engine-ndb
【解决方案1】:
不,您不能在不先读取对象的情况下更新它。当您用新数据“覆盖”一个对象时,该对象的新版本将仅包含明确写入的数据。
您可能应该创建一个允许客户端设置的属性列表,并仅使用客户端发送且位于白名单中的那些属性值更新对象(在读取之后)。
例如(使用 NDB 语法):
whitelist = ['prop1', 'prop2', ...]
def update_entity(key, **changed_values):
ent = key.get()
for name, value in changed_values.items():
if name in whitelist:
setattr(ent, name, value) # Or ent._properties[name]._set_value(ent, value)
ent.put()