Gql获取祖先的所有子项但不包括祖先本身
我正在尝试在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
显然,这样做效率要低很多。一个更简单、更高效的方法是直接获取所有结果,然后把你不想要的那个去掉。