2017-06-08 5 views
0

J'ai créé un photobloc personnalisé pour intégrer des photos dans un article de blog. J'essaye de créer un modèle de balise qui me permettrait d'obtenir chaque photoBlock stocké dans la base de données, presque comme si vous interrogiez des pages dans Wagtail. Je préférerais ne pas avoir à créer une page séparée pour chaque photo, mais plutôt être capable de les afficher sur une page différente si possible via la balise de modèle.Obtenir tous les blocs StreamField de type spécifique

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() 

Je suis en mesure d'obtenir ce qui suit pour travailler, mais il se sent comme la requête est très lourd et s'enliser une fois que j'ai un tas de messages.

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

Existe-t-il une meilleure façon d'interroger un bloc spécifique de Streamfield? Chaque fois que j'essaie quelque chose comme ça

photoBlock.objects.all() 

J'ai toujours une réponse d'erreur que photoBlock n'a pas d'attribut Object. Des idées?

Répondre

0

Malheureusement, il n'y a pas de moyen plus efficace pour interroger les blocs StreamField que de boucler sur toutes les pages qui les contiennent, comme vous le faites dans votre extrait de code. C'est une limitation de l'implémentation de StreamField - les données sont stockées en tant que chaîne de JSON sur l'objet page, plutôt que les blocs étant des objets de base de données "true".

+0

hey merci pour la réponse rapide. Auriez-vous des suggestions sur la façon de mieux structurer mes modèles alors? Une idée que j'ai est de créer un modèle de page pour chaque photo, puis l'intégrer via un PageChooserBlock ou quelque chose. –

0

Pas vraiment de réponse ici non plus. Ce que vous pouvez faire pour améliorer votre requête est de vérifier si la chaîne 'photoBlock' est présente dans le corps de la page. Les données de flux sont simplement stockées sous la forme d'une chaîne JSON, de sorte que seules les pages qui contiennent ce bloc sont répertoriées.