2013-05-30 28 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,你可以直接轻松地做。 –