1

私が正しい方法で物事を行っていることを誰かに確認してもらいたいだけです。

私はこの構造を持っています: ページ (祖先 = 章) を持つ章 (祖先 = 本) を持つ本

章を 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)

実際、コンテンツを表示するためにページを検索する必要がある場合、次のように完全なチェーンを URL に渡します。

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 コマンドではありません)。私の推測は正しいですか?

4

1 に答える 1

3

いいえ、その必要はありません。要点は、キーがパスであるということです。それらを動的に構築し、完全なデータストアがある場合にのみデータストアにアクセスできます。あなたの場合、それは次のようなものです:

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

その他の例については、NDB のドキュメントを参照してください。

于 2013-05-30T08:24:16.793 に答える