2013-05-30 86 views
1

我只希望有人確認我正在以正確的方式做事。與GAE的祖先合作

我有這樣的結構:有章(祖先=書)有網頁圖書(祖先=章)

顯然對我來說,要搜索的ID一章,我需要的書由祖先查詢搜索。

我的疑問是:我是否需要所有的連鎖書籍章節來搜索一個頁面?

例如(我在NDB):

class Book(ndb.Model): 
    # Search by id 
    @classmethod 
    def by_id(cls, id): 
     return Book.get_by_id(long(id)) 

class Chapter(ndb.Model): 
    # Search by id 
    @classmethod 
    def by_id(cls, id, book): 
     return Chapter.get_by_id(long(id), parent=book.key) 

class Page(ndb.Model): 
    # Search by id 
    @classmethod 
    def by_id(cls, id, chapter): 
     return Page.get_by_id(long(id), parent=chapter.key) 

事實上,當我需要搜索頁面顯示其內容,我傳遞的完整鏈條在這樣的網址:

GETPAGE BOOKID = 5901353784180736 & chapterId = 5655612935372800 & PAGEID = 1132165198169

所以,在控制器中,我有這樣的:

def get(self): 
    # Get the id parameters 
    bookId = self.request.get('bookId') 
    chapterId = self.request.get('chapterId') 
    pageId = self.request.get('pageId') 

    if bookId and chapterId and pageId: 
     # Must be a digit 
     if bookId.isdigit() and chapterId.isdigit() and pageId.isdigit(): 
      # Get the book 
      book = Book.by_id(bookId) 

      if book: 
       # Get the chapter 
       chapter = Chapter.by_id(chapterId, book) 

       if chapter: 
        # Get the page 
        page = Page.by_id(pageId, chapter) 

這是正確的方法嗎?我是否必須始終使用URL中的完整鏈來獲取鏈的最終元素?

如果這是正確的,我想這種使用NDB的工作方式不會對數據存儲產生任何影響,因爲對這個頁面的重複調用總是碰到同一本書,章節和頁面的NDB緩存(因爲我正在通過ID獲取,不是獲取命令)。我認爲是正確的嗎?

回答

3

不,沒有必要這樣做。關鍵是鍵是路徑:您可以動態構建它們,只有在完整的時候才能訪問數據存儲區。在你的情況下,它是這樣的:

page_key = ndb.Key(Book, bookId, Chapter, chapterId, Page, pageId) 
page = page_key.get() 

更多示例請參閱the NDB docs

+0

嗯,所以我仍然需要通過每個頁面請求保存URL中的所有鏈,但是我可以將3個對數據庫的調用減少到只有1個。是這樣嗎?我之前已經閱讀過文檔,但在使用Keys方面對我來說不太清楚(可能我不太瞭解)。最後,你認爲我必須改變我的by_id方法直接使用bookId來傳遞書籍實例嗎?感謝您的迴應。 – Eagle

+2

如果你不想在URL中單獨傳遞整個鏈,你可以使用'page_key.urlsafe()',它將整個事物編碼成一個(長)字符串。 –

+0

我不明白你關於by_id方法的問題:雖然我必須說我根本不明白by_id方法的意義,因爲他們只是調用get_by_id,你可以直接輕鬆地做。 –