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で定義した追加のフィールドは、それぞれ独自のテーブルに存在します。ページのインスタンスを取得する場合、それはあなたがそれを通じ取得したモデルに応じて2つの形式のいずれかで存在することができます。

>> 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インスタンスから行くことができる - これは1つの余分のデータベースクエリが発生します:

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

またspecific()メソッドを呼び出すことができますPageQuerySetで、そのクエリーセットに存在する別個のページタイプごとに1つの追加のクエリを実行します。

>> root.get_tree().specific() 
<PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]> 
関連する問題