2017-06-08 8 views
0

写真をブログの投稿に埋め込むカスタムphotoBlockを作成しました。私はデータベースに格納されているすべてのphotoBlockを取得できるテンプレートタグを作成しようとしています.Wagtailのクエリページとほとんど同じです。私は、写真ごとに別々のページを作成する必要はなく、できる限りテンプレートタグを使って別のページに表示できるようにしたいと考えています。特定のタイプのすべてのStreamFieldブロックを取得

class photoBlock(blocks.StructBlock): 
    date = blocks.DateBlock("Date Image Was Taken") 
    location = blocks.CharBlock(max_length=100) 
    image = ImageChooserBlock() 
    latitude = blocks.DecimalBlock(max_digits=9, decimal_places=6) 
    longitude = blocks.DecimalBlock(max_digits=9, decimal_places=6) 
    description = blocks.RichTextBlock() 

私は仕事に以下を得ることができるけど、クエリは非常に重いと私はポストの束を持ってたら行き詰まるますようにそれは感じています。

for page in BlogPage.objects.all(): 
    for block in page.body.stream_data: 
      if block['type'] == 'photoBlock': 
       return block 

Streamfieldから特定のブロックを照会する方法はありますか?いつでも私は、私はいつもphotoBlockは、属性オブジェクトを持っていないというエラーレスポンスを取得し、この

photoBlock.objects.all() 

のようなものを試してみてください。何か案は?

答えて

0

残念ながら、StreamFieldブロックのクエリには、コードスニペットで行っているように、それを含むすべてのページをループするより効率的な方法はありません。これは、StreamFieldの実装の制限です。データは、ブロックが「真の」データベースオブジェクトではなく、ページオブジェクトにJSONの文字列として格納されます。

+0

お返事ありがとうございました。私のモデルをより良く構築するための提案はありますか?私が持っている1つのアイデアは、各写真のページモデルを作成し、PageChooserBlockなどで埋め込むことです。 –

0

ここでも実際の回答はありません。クエリを改善するためにできることは、文字列 'photoBlock'がページ本文に存在するかどうかを確認することです。ストリームデータは単純にJSON文字列として格納されるので、そのブロックを含むページだけが生成されます。

関連する問題