ChildPage.objects.child_of(self) 和 ParentPage.get_children() 有什么区别?

What is the difference between ChildPage.objects.child_of(self) and ParentPage.get_children()?

我认为 ChildPage.objects.child_of(self)ParentPage.get_children() 产生相同的结果,因为 ParentPagesubpage_types 只是一个 ['ChildPage']

但是当我尝试过滤 ParentPage.get_children() 的结果时出现错误。

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)

        child = self.get_children().live().public()               # <- don't works
        child = ChildPage.objects.child_of(self).live().public()  # <- works

        if request.GET.get('tag', None):
            tags = request.GET.get('tag')
            child = child.filter(tags__slug__in=[tags])  # <- error here

        context["child"] = child
        return context

回溯(最近调用最后):

Cannot resolve keyword 'tags' into field. Choices are: alias_of, alias_of_id, aliases, blogindexpage, blogpage, content_type, content_type_id, depth, draft_title, expire_at, expired, first_published_at, formsubmission, go_live_at, group_permissions, has_unpublished_changes, homepage, id, last_published_at, latest_revision_created_at, live, live_revision, live_revision_id, locale, locale_id, locked, locked_at, locked_by, locked_by_id, numchild, owner, owner_id, partnerindexpage, partnerpage, path, redirect, revisions, search_description, seo_title, show_in_menus, sites_rooted_here, slug, title, translation_key, url_path, view_restrictions, workflow_states, workflowpage

对于 self.get_children(),child 页面的页面类型是事先不知道的 - 一个页面的 children 可能包括多种不同的类型。由于 Django 查询集不(作为标准*)支持组合来自多个模型的数据,结果以基本 Page 类型返回,它仅包含所有页面共有的核心字段,例如标题和 slug。因此,对 tags 的过滤失败,因为页面模型中不存在该字段。

使用 ChildPage.objects.child_of(self),Django 预先知道页面类型是 ChildPage - 如果 self 有任何 child 其他类型的页面 - 它们不会包含在结果中 -这样就可以直接在ChildPage上查询table,这样ChildPage的所有字段(包括tags)都可以过滤

* Wagtail 确实在 queryset 上提供了一个 specific() 方法来提取页面的全部数据,但是这是作为主数据库查询完成后的后处理步骤实现的,所以这仍然不会'不允许您 filter 在不属于基本页面模型的字段上。