在GAE中与祖先合作

时间:2013-05-30 07:50:55

标签: python google-app-engine app-engine-ndb

我只想让某人确认我正在以正确的方式做事。

我有这样的结构:具有章节(祖先=章节)的章节(祖先=书籍)的书籍

对我而言,很明显,要按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获取,不是fetch命令。我的假设是正确的吗?

1 个答案:

答案 0 :(得分:3)

不,没有必要这样做。关键是键是路径:您可以动态构建它们,只有在拥有完整的数据存储区时才能访问数据存储区。在你的情况下,它是这样的:

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

有关更多示例,请参阅the NDB docs