Gql获取祖先的所有子项但不包括祖先本身

1 投票
3 回答
2611 浏览
提问于 2025-04-16 14:28

我正在尝试在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())

只需要在查询中排除掉这个帖子本身就可以了!

3 个回答

1

我不知道你的代码是不是用Python写的,但你的查询应该像这样:

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

这样做肯定不会在结果中返回post,因为一个实体不能是自己的祖先。

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类的文档。

2

你提到的解决方案在查询中使用了不等式过滤器。但这个底层的数据存储不支持不等式过滤器,所以它会被内部转换成两个单独的查询,像这样:

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

显然,这样做效率要低很多。一个更简单、更高效的方法是直接获取所有结果,然后把你不想要的那个去掉。

撰写回答