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

问题描述 投票:0回答:4

我想这样做。

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读取时间和实例小时数。

python google-app-engine google-cloud-datastore app-engine-ndb
4个回答
1
投票

如果您使用的是ndb,则以下查询应该有效

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

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


1
投票

我想出了以下代码。

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。


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背后的预期功能,但是它可以工作,并且还可以防止为投影查询生成/维护其他索引的需要。

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


0
投票

投影仅用于查询,而不是通过id获取。您可以将content.body放在不同的db模型中,并仅在Content中存储它的ndb.Key。

© www.soinside.com 2019 - 2024. All rights reserved.