我想这样做。
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读取时间和实例小时数。
如果您使用的是ndb,则以下查询应该有效
Content.query(key=Key('Content', content_id)).get(projection=[Content.title])
注意:它从查询索引中获取此数据。因此,请确保为列启用了索引。参考https://developers.google.com/appengine/docs/python/ndb/queries#projection
我想出了以下代码。
Content.query(Content.key == ndb.Key('Content', content_id)).get(projection=['etag'])
我发现了https://developers.google.com/appengine/docs/python/ndb/properties的暗示
不要将属性命名为“密钥”。此名称保留用于存储Model键的特殊属性。虽然它可以在本地工作,但名为“key”的属性将阻止部署到App Engine。
有一种比目前发布的答案更简单的方法。
如前面的答案所述,预测仅适用于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
背后的预期功能,但是它可以工作,并且还可以防止为投影查询生成/维护其他索引的需要。
唯一的缺点是,它首先在内存中检索整个实体。如果实体具有会影响性能的任意大的元数据属性,则最好使用投影查询。
投影仅用于查询,而不是通过id获取。您可以将content.body放在不同的db模型中,并仅在Content中存储它的ndb.Key。