我正在尝试在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子句中查询并排除祖先本身!
答案 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
,因为实体不能是它自己的祖先。