Wagtail 单元测试:添加子页面将它们转换为基本类型
Wagtail unit testing: Adding child pages converts them to base type
尝试为 Wagtail 和 运行 创建一些单元测试以解决以下问题:
>> root = FrontPage.add_root(instance=FrontPageFactory.build())
>> root
<FrontPage: article0>
>> root.add_child(instance=ArticlePageFactory.build())
<ArticlePage: article1>
>> root.get_tree()
<PageQuerySet [<Page: article0>, <Page: article1>]>
"article0" 从 ArticlePage 类型变为页面树中的 Page 类型。这个 Page 对象是对 ArticlePage 的引用吗?有一种我不知道的获取它的方法,还是我在这里遗漏了一些明显的东西?
同时,我通过将添加的文章页面存储在单独的列表中解决了这个问题,但我真的很想了解这里发生了什么。
Wagtail 使用 multi-table inheritance 来表示页面:所有页面类型通用的字段(例如标题和 slug,以及用于在页面树中跟踪位置的各种内部字段)是一部分所有页面类型都继承自的基本 Page
模型。您在 ArticlePage
上定义的附加字段单独存在于它们自己的 table 中。当您检索页面实例时,它可以以两种可能的形式之一存在,具体取决于您通过哪种模型检索它:
>> page = Page.objects.get(title='article1')
<Page: article1>
这是一个基本的 Page
实例,只能访问 page.title
等属性,不能访问 ArticlePage
上定义的 fields/methods。
>> page = ArticlePage.objects.get(title='article1')
<ArticlePage: article1>
这是一个完整的 ArticlePage
实例,允许您引用 page.body
.
之类的东西
遍历页面树的操作,例如get_tree()
或get_children()
,总是给你基本的Page
实例。这是出于性能原因 - 无法提前知道您将返回哪些页面类型,因此它无法判断要查询哪些 tables 以检索完整页面数据。
您可以通过访问 specific
属性 从单个 Page
实例转到更具体的页面模型的实例 - 这将产生一个额外的数据库查询:
>> page = Page.objects.get(title='article1')
>> page.specific
<ArticlePage: article1>
您还可以在 PageQuerySet
上调用 specific()
方法,这将为该查询集中存在的每个不同页面类型执行一个额外的查询:
>> root.get_tree().specific()
<PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]>
尝试为 Wagtail 和 运行 创建一些单元测试以解决以下问题:
>> root = FrontPage.add_root(instance=FrontPageFactory.build())
>> root
<FrontPage: article0>
>> root.add_child(instance=ArticlePageFactory.build())
<ArticlePage: article1>
>> root.get_tree()
<PageQuerySet [<Page: article0>, <Page: article1>]>
"article0" 从 ArticlePage 类型变为页面树中的 Page 类型。这个 Page 对象是对 ArticlePage 的引用吗?有一种我不知道的获取它的方法,还是我在这里遗漏了一些明显的东西?
同时,我通过将添加的文章页面存储在单独的列表中解决了这个问题,但我真的很想了解这里发生了什么。
Wagtail 使用 multi-table inheritance 来表示页面:所有页面类型通用的字段(例如标题和 slug,以及用于在页面树中跟踪位置的各种内部字段)是一部分所有页面类型都继承自的基本 Page
模型。您在 ArticlePage
上定义的附加字段单独存在于它们自己的 table 中。当您检索页面实例时,它可以以两种可能的形式之一存在,具体取决于您通过哪种模型检索它:
>> page = Page.objects.get(title='article1')
<Page: article1>
这是一个基本的 Page
实例,只能访问 page.title
等属性,不能访问 ArticlePage
上定义的 fields/methods。
>> page = ArticlePage.objects.get(title='article1')
<ArticlePage: article1>
这是一个完整的 ArticlePage
实例,允许您引用 page.body
.
遍历页面树的操作,例如get_tree()
或get_children()
,总是给你基本的Page
实例。这是出于性能原因 - 无法提前知道您将返回哪些页面类型,因此它无法判断要查询哪些 tables 以检索完整页面数据。
您可以通过访问 specific
属性 从单个 Page
实例转到更具体的页面模型的实例 - 这将产生一个额外的数据库查询:
>> page = Page.objects.get(title='article1')
>> page.specific
<ArticlePage: article1>
您还可以在 PageQuerySet
上调用 specific()
方法,这将为该查询集中存在的每个不同页面类型执行一个额外的查询:
>> root.get_tree().specific()
<PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]>