我有一个简单的wiki网络应用程序。它允许登录的用户编辑现有主题,或者如果该主题没有页面,则创建新内容。我一直在努力创建一个版本历史页面,列出主题的最后n次编辑以及日期/编辑器。但是,我终于成功地在一个主题的历史页面上显示了n个先前版本的列表。我的问题并不正是为什么我现在正在做的事情......但为什么我之前尝试过的事情不起作用。
这是“历史”页面的处理程序类。它的get方法以'/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}}
<div>
{% for version in history %}
<div>
{{version.content}}<br>
{{version.created}} - {{version.author}}
<a href="version/{{topic}}">view</a>
</div>
{% endfor %}
</div>
{% endblock %}
答案 0 :(得分:7)
创建版本实体时,父级为version_key()
。
当您发出祖先查询时,祖先也应该是version_key()
。但是,您正在查询祖先ndb.Key(cls, topic, parent=version_key())
我相信你想要做的是:
cls.query(ancestor=version_key()).filter(topic=topic).order(-cls.created)
顺便说一句,拥有一个祖先对你未来创建Version
个实体的表现会有害。