2017-01-17 4 views
2

In Startseite und Suchseite möchte ich alle Arten von Seiten mit verschiedenen detaillierten Anzeige auflisten. Ich schrieb den folgenden Code nach dem Dokument:Wie Unterklassen der Seite in Bachstelze abzufragen?

from wagtail.wagtailcore.models import Page 
from my.models import ArticlePage, GalleryPage, VideoPage, SharedLinkPage 


PAGE_TYPES = (ArticlePage, GalleryPage, VideoPage, SharedLinkPage,) 


class HomePage(Page): 
    subpage_types = list(PAGE_TYPES) 

    def get_context(self, request): 
     context = super(HomePage, self).get_context(request) 
     context['posts'] = Page.objects.type(PAGE_TYPES).live() 
     context['recent_posts'] = Page.objects.type(PAGE_TYPES).live() 
     return context 

In diesem Fall ich nur [<Page: 1>, <Page:2>] bekommen kann, was ich wirklich will, ist [<ArticlePage: 1>, <GalleryPage:2>].

Meine Frage ist das gleiche in Seite suchen, aber mit search Abfrage:

Page.search('something', ArticlePage) 

Wären besser:

search_backend.search('something').types(PAGE_TYPES).live() 

Antwort

3

sollten Sie verwenden das specific Attribut die spezifischste Unterklasse Form von jedem zu bekommen Seite:

http://docs.wagtail.io/en/v1.8/reference/pages/model_reference.html#wagtail.wagtailcore.models.Page.specific

Außerdem gibt es eine specific() Methode auf PageQuerySet, die auch aufgerufen werden kann, um die bestimmte Version aller Seiten in diesem Abfrage-Set abzurufen.

Beachten Sie, dass das Aufrufen von specific auf einer Seite oder einem Abfrage-Set zu einer zusätzlichen Abfrage führt. Versuchen Sie daher, alle specific-Aufrufe zusammenzufassen. Zum Beispiel, anstatt das zu tun:

 
for page in pages: 
    specific_page = page.specifiC# This will result to N extra queries (!) 
    # do something with specific_page 

tun, um eine

 
for specigic_page in pages.specific(): # 1 extra query for each page subclass 
    # do something with specific_page 
+3

Nur eine winzige Korrektur - die PageQuerySet Version von 'specific' wird eine zusätzliche Abfrage für jede einzelne Seite Typ durchführen, die in der queryset existiert. Ihr Punkt steht immer noch - es ist immer noch viel besser, als "spezifisch" auf jeder Seite einzeln zu nennen. – gasman

+2

@gasman Korrekt, es wird eine Verknüpfung erforderlich sein, um die zusätzlichen Informationen aus jeder Unterseite Tabelle zu bringen. Ich habe die Antwort ein wenig überarbeitet, um das zu reflektieren. – Serafeim

Verwandte Themen