如何在witctail中查询Page的子类?

时间:2017-01-17 06:33:51

标签: django django-models wagtail

在主页和搜索页面中,我想列出具有不同详细显示的各种页面。我在文档后面写了下面的代码:

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

在这种情况下,我只能获得[<Page: 1>, <Page:2>],我真正想要的是[<ArticlePage: 1>, <GalleryPage:2>]

我的问题在搜索页面中是相同的,但search查询:

Page.search('something', ArticlePage)

会更好:

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

1 个答案:

答案 0 :(得分:4)

您应该使用specific属性来获取每个页面的最具体的子类形式:

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

此外,specific()上还有一个PageQuerySet方法,也可以调用该方法来检索该查询集中所有页面的特定版本。

最后,请注意,在页面或查询集上调用specific会产生额外的查询,因此请尝试将所有specific个调用组合在一起。例如,而不是:

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

做一个

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