我只想让某人确认我正在以正确的方式做事。
我有这样的结构:具有章节(祖先=章节)的章节(祖先=书籍)的书籍
对我而言,很明显,要按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)
实际上,当我需要搜索一个页面来显示其内容时,我正在传递网址中的完整链:
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缓存(因为我通过id获取,不是fetch命令。我的假设是正确的吗?
答案 0 :(得分:3)
不,没有必要这样做。关键是键是路径:您可以动态构建它们,只有在拥有完整的数据存储区时才能访问数据存储区。在你的情况下,它是这样的:
page_key = ndb.Key(Book, bookId, Chapter, chapterId, Page, pageId)
page = page_key.get()
有关更多示例,请参阅the NDB docs。