Usando Key en NDB para recuperar una entidad

Tengo esta estructura: libros que tienen capítulos (ancestro = libro) que tienen páginas (ancestor = capítulo)

Para mí está claro que, para buscar un Capítulo por ID, necesito el libro para buscar por consulta ancestral. Y hoy he aprendido que si tengo todas las claves, puedo recuperar directamente la entidad sin necesidad de obtener primero el libro, luego el capítulo y luego la página, de esta manera:

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

Mi duda es: para obtener la página, por ejemplo, el número de página, ¿debo obtener primero el capítulo?

Por ejemplo :

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()

En realidad, cuando necesito buscar en la página para mostrar su contenido, estoy haciendo esto:

getPage? bookId = 5901353784180736 & chapterId = 5655612935372800 & page = 2

Entonces, en el controlador, hago esto:

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)

¿Es esta la forma correcta o hay una mejor manera en que me estoy perdiendo donde puedo hacer solo un acceso al almacén de datos, en lugar de dos?

Si esto es correcto, supongo que esta forma de trabajo, utilizando NDB, no tiene ningún impacto en el almacén de datos, porque las llamadas repetidas a esta página siempre llegan al caché NDB para el mismo capítulo y página (porque estoy usandoobtener() método, no es unha podido recuperar() mando). ¿Es mi supuesto correcto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta