1

我只希望有人确认我正在以正确的方式做事。

我有这个结构: 有章节的书(祖先=书)有页面(祖先=章节)

我很清楚,要按 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)

实际上,当我需要搜索页面以显示其内容时,我在 url 中传递完整的链,如下所示:

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 命令)。我的假设正确吗?

4

1 回答 1

3

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

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

有关更多示例,请参阅NDB 文档

于 2013-05-30T08:24:16.793 回答