, который выполнит один дополнительный запрос для каждого отдельного типа страницы, который существует в этом наборе запросов:

ка создать несколько модульных тестов для 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 и есть метод, о котором я не знаю, чтобы получить его, или я что-то упускаю здесь очевидное?

Тем временем я обошел проблему, просто сохранив добавленные страницы статей в отдельном списке, но мне бы очень хотелось понять, что здесь происходит.

Ответы на вопрос(1)

Решение Вопроса

Трясогузка используетнаследование нескольких таблиц для представления страниц: поля, которые являются общими для всех типов страниц (таких как title и 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() или же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>]>

Ваш ответ на вопрос