2017-10-02 3 views
0

할미새에 대한 몇 가지 단위 테스트를 만들려고 다음과 같은 문제로 실행 :할미새 단위 테스트 : 하위 페이지를 추가하면 기본 형식으로 변환

>> root = FrontPage.add_root(instance=FrontPageFactory.build()) 
>> root 
<FrontPage: article0> 

>> root.add_child(instance=ArticlePageFactory.build()) 
<ArticlePage: article1> 

>> root.get_tree() 
<PageQuerySet [<Page: article0>, <Page: article1>]> 

"article0"이 페이지를 입력하는 형식 ArticlePage되는 것을 간다 페이지 트리. 이 Page 객체는 ArticlePage에 대한 참조이며 내가 가져올 수있는 방법이 없습니까? 아니면 여기에 명백한 내용이없는 것입니까?

그동안 나는 추가 된 기사 페이지를 별도의 목록에 저장하여이 문제를 해결했지만 실제로 여기서 무슨 일이 벌어지고 있는지 이해하고 싶습니다.

답변

1

Wagtail은 페이지를 표현하기 위해 모든 페이지 유형에 공통된 필드 (제목 및 슬러그, 페이지 트리 내에서의 위치를 ​​추적하는 데 사용되는 다양한 내부 것들과 함께)는 Page 모델의 일부입니다 모든 페이지 유형이 상속합니다. ArticlePage에 정의한 추가 필드는 자체 테이블에 별도로 존재합니다.

>> page = Page.objects.get(title='article1') 
<Page: article1> 

이 기본 Page 인스턴스이며, 만 page.title이 아닌 필드와 같은 속성에 액세스 할 수 있습니다 당신은 페이지 인스턴스를 검색 할 때, 어떤 모델에 당신이 그것을 통해 검색이 개 가능한 형태 중 하나가 따라 존재할 수/방법은 ArticlePage에 정의되어 있습니다.

>> page = ArticlePage.objects.get(title='article1') 
<ArticlePage: article1> 

이 당신이 page.body 같은 것들을 참조 할 수 있도록 전체 ArticlePage 인스턴스입니다.

페이지 트리를 가로 지르는 작업 (예 : get_tree() 또는 get_children())은 항상 기본 Page 인스턴스를 제공합니다. 이것은 성능상의 이유로 - 다시 돌아올 페이지 유형을 사전에 알 수있는 방법이 없으므로 전체 페이지 데이터를 검색하기 위해 어떤 테이블을 쿼리해야하는지 알 수 없습니다.

당신은 더 특정 페이지 모델의 specific 속성에 액세스하여 인스턴스로 개인 Page 인스턴스에서 갈 수 있습니다 -이 하나 개 추가 데이터베이스 쿼리 부과됩니다 :

>> page = Page.objects.get(title='article1') 
>> page.specific 
<ArticlePage: article1> 

당신은 또한 specific() 메소드를 호출 할 수 있습니다 PageQuerySet에있는이 쿼리 세트에있는 각 페이지 유형마다 하나의 추가 쿼리를 수행합니다.

>> root.get_tree().specific() 
<PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]>