我想这样做。
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读取时间和实例小时数。
答案 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。