在App Engine中仅获取ReferenceProperty的Key/id
我在使用AppEngine的时候遇到了一些问题,想请教一下...
我用[Python]的API创建关系,像文档里的这个例子:
class Author(db.Model):
name = db.StringProperty()
class Story(db.Model):
author = db.ReferenceProperty(Author)
story = db.get(story_key)
author_name = story.author.name
根据我的理解,这个例子会进行两次数据存储查询。第一次是获取故事,第二次是获取作者的名字。不过我想直接获取ID,所以想做成这样:
story = db.get(story_key)
author_id = story.author.key().id()
我只想从引用中获取ID,不想再去查询数据存储里的ReferenceProperty值。
我在阅读文档时看到说:
ReferenceProperty的值是一个Key
这让我觉得我可以直接在引用的值上调用.id()。但文档里还提到:
ReferenceProperty模型提供了Key属性值的功能,比如自动解引用。
我找不到任何解释说这个引用到底是什么时候发生的?
在ReferenceProperty的值上调用.id()是安全的吗?
能否认为调用.id()不会导致数据存储的查找?
1 个回答
27
为了帮助其他寻找答案的人,我来回答我自己的问题...
果然,调用 story.author.key().id() 或者 story.author.id() 会导致数据库查询。根据 API 文档,正确的方法是:
story = db.get(story_key)
author_id = Story.author.get_value_for_datastore(story).id()