我有一个简单的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 %}{% endblock %}{{version.content}}{% endfor %}
{{version.created}} - {{version.author}} view
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
实体的表现会有害.
创建Version实体时,父实体是version_key()
.
当您发出祖先查询时,祖先也应该如此version_key()
.但是,您正在向祖先查询ndb.Key(cls, topic, parent=version_key())
我相信你想要做的是:
cls.query(ancestor=version_key()).filter(topic=topic).order(-cls.created)
顺便说一句,拥有一个祖先对你未来创建Version
实体的表现会有害.