我有这个结构: 有章节的书(祖先=书)有页面(祖先=章节)
我很清楚,要按 ID 搜索章节,我需要按祖先查询搜索书。而且我今天了解到,如果我拥有所有密钥,我可以直接检索实体,而无需先获取书,然后是章节,然后是页面,这样:
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&page=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 缓存(因为我使用的是get( )方法,它不是fetch()命令)。我的假设对吗?