2013-05-30 2 views
1

나는 누군가 내가 올바른 방법으로 일을하고 있음을 확인하기를 원합니다.GAE에서 조상과 함께 작업

내가이 구조를 가지고 : 페이지 수있는 장 (조상 = 책)이 책 (조상 = 장)

ID로 장을 검색 할 것을 나를 위해 분명하다을, 나는에 책을 필요로 조상 쿼리로 검색하십시오.

의심 할 여지가 있습니다. 페이지를 검색 할 때 모든 체인 북 장이 필요합니까?

예를 들어 (I는 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 & 페이지 id = 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를 사용하여이 작업 방법은, (때문에, 데이터 저장소에 영향을주지 않는 것으로 가정 나는 이드에 의해 얻고있다. 가져 오기 명령이 아니다.) 제 생각은 맞습니까?

답변

3

아니요, 그렇게 할 필요가 없습니다. 요점은 키가 경로라는 것입니다. 동적으로 키를 구성하고 완전한 키가있을 때만 데이터 저장소에 도달 할 수 있습니다.

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

더 많은 예제 the NDB docs를 참조하십시오 : 귀하의 경우,이 같은입니다.

+0

음, 모든 페이지 요청을 통해 URL의 모든 체인을 저장해야하지만 데이터베이스에 대한 3 건의 호출을 1로만 줄일 수 있습니다. 이전에 문서를 읽었지 만 Keys 사용에 관해서는 분명하지 않습니다 (어쩌면 잘 이해하지 못할 수도 있습니다). 마지막으로 book 인스턴스를 전달하는 대신 bookId를 직접 사용하려면 by_id 메서드를 변경해야한다고 생각합니까? 응답 해 주셔서 감사합니다. – Eagle

+2

전체 체인을 URL에서 개별적으로 전달하고 싶지 않은 경우 전체를 하나의 (긴) 문자열로 인코딩하는'page_key.urlsafe()'를 사용할 수 있습니다. –

+0

그리고 by_id 메서드에 대한 귀하의 질문을 이해하지 못합니다. 비록 내가 그냥 by_id 메서드의 요점을 전혀 이해하지 못한다고 말해야합니다. 그냥 get_by_id를 호출하기 때문에 쉽게 직접 할 수 있습니다. –

관련 문제