Использование ключа в NDB для получения объекта

У меня есть такая структура: Книги, которые имеют Главы (предок = Книга), которые имеют Страницы (предок = Глава)

Для меня очевидно, что для поиска главы по идентификатору мне нужна книга для поиска по запросу предка. И сегодня я узнал, что если у меня есть все ключи, я могу напрямую получить сущность без необходимости сначала получать книгу, затем главу и затем страницу следующим образом:

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

Я сомневаюсь: чтобы получить страницу, например, по номеру страницы, я должен сначала получить главу?

Например :

class Book(ndb.Model):
    name = ndb.StringProperty(required=True)

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

class Chapter(ndb.Model):
    name = ndb.StringProperty(required=True)

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

class Page(ndb.Model):
    pageNumber = ndb.IntegerProperty(default=1)
    content = ndb.StringProperty(required=True)

    # Search by page
    @classmethod
    def by_page(cls, number, chapter):
        page = Page.query(ancestor=chapter.key)
        page = page.filter(Page.pageNumber == int(number))
        return page.get()

На самом деле, когда мне нужно найти страницу, чтобы отобразить ее содержимое, я делаю это:

GetPage? BookID = 5901353784180736 & chapterId = 5655612935372800 & страница = 2

Итак, в контроллере я делаю это:

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

    if bookId and chapterId and pageNumber:
        # Must be a digit
        if bookId.isdigit() and chapterId.isdigit() and pageNumber.isdigit():
            # Get the chapter
            chapter_key = ndb.Key('Book', long(bookId), 'Chapter', long(chapterId))
            chapter = chapter_key.get()

            if chapter:
                # Get the page
                page = Page.by_number(pageNumber, chapter)

Это правильный путь, или мне не хватает лучшего способа, когда я могу сделать только доступ к хранилищу данных, а не два?

Если это правильно, я предполагаю, что такой способ работы с использованием NDB не оказывает никакого влияния на хранилище данных, потому что повторные вызовы этой страницы всегда попадают в кэш NDB для одной и той же главы и страницы (потому что я используюполучить() метод, это невыборки () команда). Правильно ли мое предположение?

Ответы на вопрос(1)

Ваш ответ на вопрос