在Google App Engine / Django上存储wiki修订版 - 修改此现有代码

时间:2009-10-18 00:29:40

标签: python django google-app-engine django-models

过去,我创建了一个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)

2 个答案:

答案 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以接受G​​ET参数来指定您要查看或编辑的修订版本。当用户想要修订时,我从数据库中获取页面,并将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