鹡鸰用途多表继承表示页面:所有页面类型共有的字段(例如标题和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>]>