在Google App Engine/Django上存储Wiki修订 - 修改现有代码
以前,我创建了一个Django维基网站,制作一个页面表来存储当前的维基条目非常简单,然后把旧版本存到一个修订表里。
最近,我决定在Google App Engine上搭建一个网站,使用了另一个程序员写的一些维基代码。因为他创建的页面模型用了一种对我来说比较复杂的方式(至少我觉得复杂),使用了实体,所以我不太确定该如何创建修订表,并把它和他的页面模型结合起来。
这里是相关的代码。有人能帮我写一下修订模型,并把保存修订的功能整合到页面模型的保存方法里吗?
class Page(object):
def __init__(self, name, entity=None):
self.name = name
self.entity = entity
if entity:
self.content = entity['content']
if entity.has_key('user'):
self.user = entity['user']
else:
self.user = None
self.created = entity['created']
self.modified = entity['modified']
else:
# New pages should start out with a simple title to get the user going
now = datetime.datetime.now()
self.content = '<h1>' + cgi.escape(name) + '</h1>'
self.user = None
self.created = now
self.modified = now
def save(self):
"""Creates or edits this page in the datastore."""
now = datetime.datetime.now()
if self.entity:
entity = self.entity
else:
entity = datastore.Entity('Page')
entity['name'] = self.name
entity['created'] = now
entity['content'] = datastore_types.Text(self.content)
entity['modified'] = now
if users.GetCurrentUser():
entity['user'] = users.GetCurrentUser()
elif entity.has_key('user'):
del entity['user']
datastore.Put(entity)
顺便说一下,这段代码来自: http://code.google.com/p/google-app-engine-samples/downloads/list
我对GAE Django模型还很不熟悉,我的模型通常都很简单。例如,这是我为博客文章写的模型:
class Article(db.Model):
author = db.UserProperty()
title = db.StringProperty(required=True)
text = db.TextProperty(required=True)
tags = db.StringProperty(required=True)
date_created = db.DateProperty(auto_now_add=True)
2 个回答
1
你第一个代码片段里的内容其实不是一个模型,而是一个自定义的类,它使用了比较底层的数据存储模块。如果你想要扩展这个功能,我建议你把它扔掉,换成真正的模型,就像你在第二个代码片段中展示的文章模型那样。
另外,这些是App Engine的模型,而不是Django的模型——Django的模型在App Engine上是不能用的。
0
我创建了这个模型(它模仿了Page类):
class Revision (db.Model):
name = db.StringProperty(required=True)
created = db.DateTimeProperty(required=True)
modified = db.DateTimeProperty(auto_now_add=True)
content = db.TextProperty(required=True)
user = db.UserProperty()
在Page类的Save()方法中,我添加了这段代码,用来保存一个修订版本,然后再用新数据更新字段:
r = Revision(name = self.name,
content = self.content,
created = self.created,
modified = self.modified,
user = self.user)
r.put()
现在我已经设置好维基,可以接受一个GET参数来指定你想查看或编辑哪个修订版本。当用户想要某个修订版本时,我会从数据库中获取这个页面,并用修订版本的内容替换页面的内容:
page = models.Page.load(title)
if request.GET.get('rev'):
query = db.Query(models.Revision)
query.filter('name =', title).order('created')
rev = request.GET.get('rev')
rev_page = query.fetch(1, int(rev))
page.content = rev_page.content