为什么这个Google App Engine ndb祖先查询不起作用?

Tot*_*tem 1 python google-app-engine jinja2 webapp2 google-cloud-datastore

我有一个简单的wiki网络应用程序.它允许登录的用户编辑现有主题,或者如果该主题没有页面,则创建新内容.我一直在努力创建一个版本历史页面,列出主题的最后n次编辑以及日期/编辑器.但是,我终于成功地在一个主题的历史页面上显示了n个先前版本的列表.我的问题并不正是为什么我现在正在做的事情......但为什么我之前尝试过的事情不起作用.

这是"历史"页面的处理程序类.它的get方法接收主题为以下形式的arg '/topic':

class History(Main):
    """ Display previous versions of a topic if they exist """

    def get(self, topic):
        topic = topic[1:]
        history = Version.get_topic_history(topic).fetch(10)
        if history:
            self.render('history.html', history=history, topic=topic)
        else:
            self.redirect('/%s' % topic)
Run Code Online (Sandbox Code Playgroud)

以下是存储所有主题编辑的模型.它有一个classmethod,get_topic_history.它按主题名称查询所有实体的Version类,然后按创建日期返回它们.这有效.但是,你可以看到就在那条线上方,注释掉了,就是我原来做的,那是行不通的.在第一个注释掉的行中,我检索了具有包含特定主题名称的祖先路径的所有实体的密钥(我认为这称为祖先查询,至少,这是我理解它要做的事情).然后我通过祖先路径返回一个查询,并按创建日期/时间排序.您可以从History处理程序中调用此方法.对我来说,看起来应该返回与我当前方法相同的结果,但它什么也没有返回.谁能告诉我为什么?并提前感谢所有答案.

class Version(ndb.Model):
    """ wiki version history """

    created = ndb.DateTimeProperty(auto_now_add=True)
    author = ndb.StringProperty(required=True)
    topic = ndb.StringProperty(required=True)
    content = ndb.TextProperty(required=True)

    @classmethod
    def get_topic_history(cls, topic):
        # key = ndb.Key(cls, topic, parent=version_key())
        # return cls.query(ancestor=key).order(-cls.created)
        return cls.query(cls.topic == topic).order(-cls.created)
Run Code Online (Sandbox Code Playgroud)

这是我存储版本的方式:

version = Version(topic=topic,
                  content=content,
                  author=User.get_user_name(self.user_id()),
                  parent=version_key())
version.put()
Run Code Online (Sandbox Code Playgroud)

在上面的代码中分配父键的版本键功能在任何类之外:

def version_key():
    return ndb.Key('Group', 'version_group')
Run Code Online (Sandbox Code Playgroud)

最后这是一个history.html模板示例.我使用的是Jinja2:

{% extends "base.html" %}
{% block content %}

Topic edit history :: {{topic}}

<div>
    {% for version in history %}
    <div>
        {{version.content}}<br>
        {{version.created}} - {{version.author}}

        <a href="version/{{topic}}">view</a>
    </div> 
    {% endfor %}
</div> 
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

dra*_*onx 7

创建Version实体时,父实体是version_key().

当您发出祖先查询时,祖先也应该如此version_key().但是,您正在向祖先查询ndb.Key(cls, topic, parent=version_key())

我相信你想要做的是:

cls.query(ancestor=version_key()).filter(topic=topic).order(-cls.created)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,拥有一个祖先对你未来创建Version实体的表现会有害.