Использование ключа в 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 для одной и той же главы и страницы (потому что я используюполучить() метод, это невыборки () команда). Правильно ли мое предположение?