Gql在没有祖先的情况下获得祖先的所有孩子

时间:2011-03-26 16:05:33

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

我正在尝试在GAE上建立一个类似平台的论坛。

首先我要提一下:我对GAE有点新鲜。

我想将所有回复都提取到特定帖子。 到目前为止,结构看起来像这样:

- Forum
--- Post
----- Reply ( = Post with Post as a parent )

回复只是帖子作为父母的帖子(而不是作为父母的论坛)。

当我尝试取出所有回复时问题就开始了,返回的结果包括祖先本身。

如果没有祖先本身,我怎样才能达到同样的目标?(可能还需要提一下我搜索了一个解决方案,但没找到一个)

修改

我的查询是这样的:

replies = db.GqlQuery("SELECT * FROM Post WHERE ANCESTOR IS :1", post)

谢谢!

更新

我找到了一条路:

db.GqlQuery("SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ != :2", post, post.key())

只需在where子句中查询并排除祖先本身!

3 个答案:

答案 0 :(得分:2)

如果您有父键,则不必获取父帖子实体。如果您有父帖子密钥的字符串版本:

parent_post = db.Key(string_version_of_the_key)
replies = Post.all().ancestor(parent_post).fetch(num_to_fetch)

如果您有父帖子的密钥ID或名称:

parent_post = db.Key.from_path('Post', id_or_key_name)
replies = Post.all().ancestor(parent_post).fetch(num_to_fetch)

有关详细信息,请参阅Key课程中的文档。

答案 1 :(得分:2)

您提出的解决方案在查询中使用不等式过滤器。底层数据存储区不支持不等式过滤器,并且内部转换为两个单独的查询,如下所示:

SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ < :2
SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ > :2

显然,效率大大降低。一个更简单,更有效的选择是简单地获取所有结果,然后丢弃您不想要的一个实体。

答案 2 :(得分:1)

我不知道您的代码是否在Python中,但您的查询应该如下所示:

replies = Reply.ancestor(post).fetch(num_to_fetch)

肯定不会在结果集中返回post,因为实体不能是它自己的祖先。