过去,我创建了一个Django wiki,为当前的wiki条目制作一个Page表,然后将旧版本存储到Revision表中是相当简单的。
最近,我决定在Google App Engine上建立一个网站,我使用了一些其他程序员编写的维基代码。因为他使用实体以复杂的方式创建了他的Page模型(至少对我来说很复杂),我不确定如何创建Revision表并将其与他的Page模型集成。
这是相关代码。有人可以帮我编写Revision模型,并将修订版本与Page模型的Save方法保存在一起吗?
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)
答案 0 :(得分:1)
第一个代码段中的代码不是模型 - 它是使用低级数据存储模块的自定义类。如果你想扩展它,我会建议把它扔掉并用实际模型替换它,类似于你在第二个片段中演示的Article模型。
此外,他们是App Engine模型,而不是Django模型 - Django模型不适用于App Engine。
答案 1 :(得分: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()
我现在设置了wiki以接受GET参数来指定您要查看或编辑的修订版本。当用户想要修订时,我从数据库中获取页面,并将Page的内容替换为Revision的内容:
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