【问题标题】:How to query subclasses of Page in wagtail?如何在 wagtail 中查询 Page 的子类?
【发布时间】:2017-01-17 06:33:50
【问题描述】:

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

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

【问题讨论】:

    标签: django django-models wagtail


    【解决方案1】:

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

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

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

    最后,请注意在页面或查询集上调用 specific 会导致额外的查询,因此请尝试将所有 specific 调用组合在一起。例如,不要这样做:

    对于页面中的页面: specific_page = page.specific # 这将导致 N 个额外的查询 (!) # 用 specific_page 做一些事情

    做一个

    for specific_page in pages.specific(): # 每个页面子类的 1 个额外查询 # 用 specific_page 做一些事情

    【讨论】:

    • 只是一个微小的修正——specific 的 PageQuerySet 版本将对查询集中存在的每个不同页面类型执行一个额外的查询。不过,您的观点仍然存在 - 它仍然比在每个页面上单独调用 specific 好得多。
    • @gasman 正确,它需要进行连接以从每个子页面表中获取额外信息。我已经稍微编辑了答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多