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

 -苏小澄11m 发布于 2023-02-12 18:35

我有一个简单的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)

以下是存储所有主题编辑的模型.它有一个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)

这是我存储版本的方式:

version = Version(topic=topic,
                  content=content,
                  author=User.get_user_name(self.user_id()),
                  parent=version_key())
version.put()

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

def version_key():
    return ndb.Key('Group', 'version_group')

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

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

Topic edit history :: {{topic}}

{% for version in history %}
{{version.content}}
{{version.created}} - {{version.author}} view
{% endfor %}
{% endblock %}

dragonx.. 7

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

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

我相信你想要做的是:

cls.query(ancestor=version_key()).filter(topic=topic).order(-cls.created)

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

1 个回答
  • 创建Version实体时,父实体是version_key().

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

    我相信你想要做的是:

    cls.query(ancestor=version_key()).filter(topic=topic).order(-cls.created)
    

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

    2023-02-12 18:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有