部分更新App Engine实体

时间:2012-08-22 17:29:04

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我正在使用App Engine构建同步引擎,当我从客户端接收数据时,我想存储一个对象,但我不在乎它是否已经存在。如果我总是在更新时从客户端发送所有属性,它今天很好用。但我想......

  • 客户端无法识别的某些内部属性,但仍然存在更新
  • 客户端只能发送更改后的值
  • 避免在更新之前获取所有对象,因为可能有很少的对象需要更新

我是否需要获取每个对象,然后仅更新我想要更改的值,然后更新对象?或者是否可以在不提取实体的情况下部分更新实体?

1 个答案:

答案 0 :(得分:2)

不,如果没有先阅读它,就无法更新对象。当您使用新数据“覆盖”对象时,该对象的新版本将仅包含 明确写入的数据。

您应该创建允许客户端设置的属性列表,并使用客户端发送的和白名单中的属性值更新对象(在读取之后)。

E.g。 (使用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()