GAE python ndb - 如何使用投影get_by_id?

时间:2014-09-08 02:33:12

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

我想这样做。

Content.get_by_id(content_id, projection=['title'])

然而,我收到了一个错误。

TypeError: Unknown configuration option ('projection')

我应该这样做。怎么样?

Content.query(key=Key('Content', content_id)).get(projection=['title'])

为什么要投影获取实体?因为Content.body可能很大,所以我想减少db读取时间和实例小时数。

4 个答案:

答案 0 :(得分:1)

如果您使用的是ndb,则以下查询应该可以正常工作

Content.query(key=Key('Content', content_id)).get(projection=[Content.title])

注意:它从查询索引中获取此数据。因此,请确保为列启用了索引。参考https://developers.google.com/appengine/docs/python/ndb/queries#projection

答案 1 :(得分:1)

我想出了以下代码。

Content.query(Content.key == ndb.Key('Content', content_id)).get(projection=['etag'])

我从https://developers.google.com/appengine/docs/python/ndb/properties

找到了提示
  

不要说出一个属性" key。"此名称仅供特殊使用   用于存储Model键的属性。虽然它可以在本地工作,但是   名为" key"将阻止部署到App Engine。

答案 2 :(得分:1)

有一种比目前发布的答案更简单的方法。

如前所述,预测仅适用于ndb.Queries。

以前的答案建议使用get_by_id返回的实体以以下形式执行投影查询:

<Model>.query(<Model>.key == ndb.Key('<Model>', model_id).get(projection=['property_1', 'property_2', ...])

但是,您可以直接操纵模型的_properties。 (见:https://cloud.google.com/appengine/docs/standard/python/ndb/modelclass#intro_properties

例如:

desired_properties = ['title', 'tags']

content = Content.get_by_id(content_id)
content._properties = {k: v for k, v in content._properties.iteritems()
                       if k in desired_properties}
print content

这将更新实体属性,并仅返回其键位于desired_properties列表中的属性。

不确定这是否是_properties背后的预期功能,但是它有效,并且还可以防止为投影查询生成/维护其他索引。

唯一的缺点是,它首先在内存中检索整个实体。如果实体具有会影响性能的任意大的元数据属性,则最好使用投影查询。

答案 3 :(得分:0)

投影仅适用于查询,不适用于ID。您可以将content.body放在不同的db模型中,并仅在Content中存储它的ndb.Key。