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()
产生相同的结果,因为 ParentPage 的 subpage_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
在不属于基本页面模型的字段上。
我认为 ChildPage.objects.child_of(self)
和 ParentPage.get_children()
产生相同的结果,因为 ParentPage 的 subpage_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
在不属于基本页面模型的字段上。