Wagtail 单元测试:添加子页面将它们转换为基本类型

2023-12-15

尝试为 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 的引用,并且有一个我不知道的方法来获取它,还是我在这里遗漏了一些明显的东西?

与此同时,我通过将添加的文章页面存储在单独的列表中来解决这个问题,但我真的很想了解这里发生了什么。


鹡鸰用途多表继承表示页面:所有页面类型共有的字段(例如标题和slug,以及用于跟踪页面树中位置等的各种内部字段)是基础的一部分Page所有页面类型都继承自的模型。您定义的附加字段ArticlePage单独存在于自己的表中。当您检索页面实例时,它可以以两种可能的形式之一存在,具体取决于您通过哪个模型检索它:

>> page = Page.objects.get(title='article1')
<Page: article1>

这是一个基本的Page实例,并且只能访问诸如page.title,不是定义的字段/方法ArticlePage.

>> page = ArticlePage.objects.get(title='article1')
<ArticlePage: article1>

这是一个完整的ArticlePage实例,允许您引用诸如page.body.

遍历页面树的操作,例如get_tree() or get_children(),总是给你基本的Page实例。这是出于性能原因 - 无法提前知道您将返回哪些页面类型,因此它无法告诉要查询哪些表以检索完整页面数据。

你可以从个人开始Page通过访问更具体的页面模型的实例specific属性 - 这将产生一个额外的数据库查询:

>> page = Page.objects.get(title='article1')
>> page.specific
<ArticlePage: article1>

您还可以致电specific()上的方法PageQuerySet,它将对该查询集中存在的每种不同的页面类型执行一个额外的查询:

>> root.get_tree().specific()
<PageQuerySet [<FrontPage: article0>, <ArticlePage: article1>]>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wagtail 单元测试:添加子页面将它们转换为基本类型 的相关文章

随机推荐