我正在使用 App Engine 构建一个同步引擎,当我从客户端接收数据时,我想存储一个对象,但我不在乎它是否已经存在。如果我在更新时总是从客户端发送所有属性,那么今天效果很好。但我想要...
- 客户端不知道的一些内部属性在更新后仍然存在
- 客户端只能发送更改的值
- 避免在更新之前获取所有对象,因为可能需要更新的对象很少
我是否需要获取每个对象,然后只更新我想要更改的值,然后更新对象?或者是否可以部分更新实体而不获取它们?
我正在使用 App Engine 构建一个同步引擎,当我从客户端接收数据时,我想存储一个对象,但我不在乎它是否已经存在。如果我在更新时总是从客户端发送所有属性,那么今天效果很好。但我想要...
我是否需要获取每个对象,然后只更新我想要更改的值,然后更新对象?或者是否可以部分更新实体而不获取它们?
不,您不能在不先读取对象的情况下更新它。当您用新数据“覆盖”一个对象时,该对象的新版本将仅包含显式写入的数据。
您可能应该制作一个允许客户端设置的属性列表,并仅使用客户端发送且在白名单中的那些属性值更新对象(在读取之后)。
例如(使用 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()