2009-10-18 29 views
0

過去,我創建了一個Django wiki,爲當前wiki條目創建一個Page表,然後將舊版本存儲到修訂表。在Google App Engine/Django上存儲wiki修訂版 - 修改此現有代碼

最近,我決定在Google App Engine上建立一個網站,並且使用了另一位程序員編寫的一些wiki代碼。因爲他使用Entities以一種複雜的方式創建了他的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

我建立這個模型(其模擬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() 

在頁類的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 
+0

您的數據模型在這裏是合理的 - 這就是我的建議,大部分。但是,如果您將頁面重新編制爲模型而不是直接使用數據存儲,則可以對頁面和修訂執行批處理,並保存數據存儲往返。 – 2009-10-19 08:36:58

1

在您的第一個片段的代碼是不是一個模型 - 這是一個使用低級別的數據儲存模塊自定義類。如果你想擴展它,我會建議把它扔出去並用實際的模型替換它,與你在第二個片段中展示的Article模型類似。

此外,它們是App Engine模型,而不是Django模型 - Django模型不適用於App Engine。

+0

這似乎是一個不錯的答案,並給予重新選擇,我可能會走這條路。但是,我做了一個解決方案來擴展我將發佈的代碼。 – 2009-10-18 20:33:39