在App Engine中仅获取ReferenceProperty的Key/id

16 投票
1 回答
1772 浏览
提问于 2025-04-15 23:59

我在使用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()

撰写回答