使用Google Appengine在数据存储区中创建父关系

时间:2014-10-20 10:58:40

标签: python python-2.7 google-app-engine google-cloud-datastore

我正在尝试使用单个祖先创建一个根实体。当我试图从那个单一的祖先那里得到父密钥时,我得到了“没有”#39;我在这里缺少什么?

以下是我的示例代码:

        # create a single root with key_name = 'home'
        root = Page.get_or_insert('home')
        # delay added for consistency
        time.sleep(1)
        # create an ancestor with the parent key set to the key of the root
        start_page = Page(parent=root.key(), page_name="", content="<h1>welcome home</h1>")     
        start_page.put()
        time.sleep(1)

        child = Page.all().ancestor(root.key())
        utils.log('==>> %s' % child.get().key())

上面的行输出根的键,而不是子。

为什么会这样?

当我查看本地计算机上的数据存储区查看器时,这就是我所看到的: Datastore view 我没有在孩子的数据中看到任何涉及其父母的内容。

我最终的目标是从这个父母或其他父母创建许多子页面。我知道ReferenceProperty数据类型,但这似乎是一个更自然的数据模型,因此更多的Pythonic。

1 个答案:

答案 0 :(得分:1)

是指从孩子到父母的内容。如果您打印了孩子的密钥的解码值,您会看到类似[Page, 'home', Page, <long number>]的内容,其中&#34; home&#34;是父手动分配的密钥名称,长号是子项的自动生成的密钥ID。

你的问题只是祖先查询返回祖先和子节点,query.get()返回该查询的第一个结果,即祖先本身。如果您输出child.fetch()的结果,您也会看到您的孩子。

请注意,添加time.sleep并不会做任何事情来缓解任何一致性问题,因为开发数据存储区会根据请求而非时间模拟最终的一致性。但无论如何,无论如何,通过钥匙或祖先获得总是一致的。