【问题标题】:Working with ancestors in GAE在 GAE 中与祖先一起工作
【发布时间】:2013-05-30 07:50:54
【问题描述】:

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

我有这样的结构:有章节 (ancestor=Book) 的书籍有页面 (ancestor=Chapter)

我很清楚,要按 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 缓存(因为我'm get by id, 不是 fetch 命令)。我的猜想对吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    更多示例请参见the NDB docs

    【讨论】:

    • Ummm,所以我仍然需要通过每个页面请求保存URL中的所有链,但是我可以将3次数据库调用减少到只有1次。是这样吗?我以前读过文档,但在使用 Keys 方面对我来说不是很清楚(也许我不太理解)。最后,您是否认为我必须更改我的 by_id 方法以直接使用 bookId 而不是传递 book 实例?感谢您的回复。
    • 如果您不想在 URL 中单独传递整个链,您可以使用 page_key.urlsafe() 将整个内容编码为一个(长)字符串。
    • 我不明白你关于 by_id 方法的问题:虽然我必须说我根本不理解 by_id 方法的意义,因为它们只是调用 get_by_id ,你可以很容易直接做。
    • 我已经测试了您的解决方案,但无法正常工作,找不到使用此密钥格式的章节,即使使用此密钥格式:chapter_key = ndb.Key(Book, bookId, parent=ndb.Key(Chapter, chapterId))。无论如何,关于 URL,对我来说传递所有 ID 不是问题,这让我可以轻松访问以在需要时搜索特定的书或章节,但 urlsafe() 也可以让我完全访问书籍或章节,或仅页面本身?
    • 你仍然必须使用 complete 路径。 book 是章节的父级,而不是相反。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2014-07-29
    • 2012-07-31
    相关资源
    最近更新 更多