Я пытаюсь понять, как получить ссылки на все страницы моего сайта, на которых просматриваемая в данный момент страница указана как связанная страница с помощью ParentalKey modelcluster.
Базовая настройка выглядит следующим образом:
# RelatedLink inherits from LinkFields,
# both directly copied from the wagtaildemo project
class ParentPageRelatedLink(Orderable, RelatedLink):
page = ParentalKey('ParentPage', related_name='related_links')
class ParentPage(Page):
parent_page_types = ['ParentPage']
subpage_types = ['ParentPage', 'ChildPage']
def child_pages(self):
children = ChildPage.objects.live().descendant_of(self)
return children
ParentPage.content_panels = [
FieldPanel('title', classname="full title"),
FieldPanel('body', classname="full"),
InlinePanel(ParentPage, 'related_links', label="Related links"),
]
class ChildPage(Page):
parent_page_types = ['ParentPage']
parent_page_types = ['ChildPage']
def parent_index(self):
return self.get_ancestors().type(ParentPage).last()
ChildPage.content_panels = [
FieldPanel('title', classname="full title"),
FieldPanel('body', classname="full"),
InlinePanel(ChildPage, 'related_links', label="Related links"),
]
Если все правильно понять, чтобы получить каждую ParentPage, которая имеет текущую ChildPage в своих связанных_ссылках, мне нужно будет просмотреть каждую страницу, указанную в ChildPage.parent_page_types, проверить, находится ли текущая ChildPage в ParentPage.related_links, а затем вывести все, что я нужно от каждой из этих ParentPages.
Похоже, что было бы много запросов к базе данных, если бы было много экземпляров типов страниц, перечисленных в parent_page_types.
Есть ли способ лучше?
Например, разрешает ли modelcluster какие-либо обратные ссылки (например, то, что Flask-SQLAlchemy предоставляет при использовании db.relashionship(backref="something")) через ParentalKey, созданный в ParentPageRelatedLink? Это не похоже на проверку таблиц базы данных.
Изменить
Итак, похоже, что related_name из LinkFields может быть способом сделать это, но поскольку я не могу установить что-то вроде «related_from», поскольку LinkFields наследуется многими различными классами, подобными ParentPage, кажется, что я должен иметь отдельные классы LinkField с собственными уникальными определениями ForeignKey(related_name="something") для каждой ParentPage... Или действуйте, как указано в документации по django. Но тогда я мог бы быть лучше с моей первоначальной мыслью о петле?
class LinkFields(models.Model):
link_external = models.URLField("External link", blank=True)
link_page = models.ForeignKey(
'wagtailcore.Page',
null=True,
blank=True,
related_name='+'
)
link_document = models.ForeignKey(
'wagtaildocs.Document',
null=True,
blank=True,
related_name='+'
)
@property
def link(self):
if self.link_page:
return self.link_page.url
elif self.link_document:
return self.link_document.url
else:
return self.link_external
panels = [
FieldPanel('link_external'),
PageChooserPanel('link_page'),
DocumentChooserPanel('link_document'),
]
class Meta:
abstract = True