1
我只希望有人确认我正在以正确的方式做事。与GAE的祖先合作
我有这样的结构:有章(祖先=书)有网页图书(祖先=章)
显然对我来说,要搜索的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获取,不是获取命令)。我认为是正确的吗?
嗯,所以我仍然需要通过每个页面请求保存URL中的所有链,但是我可以将3个对数据库的调用减少到只有1个。是这样吗?我之前已经阅读过文档,但在使用Keys方面对我来说不太清楚(可能我不太了解)。最后,你认为我必须改变我的by_id方法直接使用bookId来传递书籍实例吗?感谢您的回应。 – Eagle
如果你不想在URL中单独传递整个链,你可以使用'page_key.urlsafe()',它将整个事物编码成一个(长)字符串。 –
我不明白你关于by_id方法的问题:虽然我必须说我根本不明白by_id方法的意义,因为他们只是调用get_by_id,你可以直接轻松地做。 –