Django Wagtail CMS:查找与当前页面相关的所有页面
我试图了解如何通过modelcluster ParentalKey获取指向我站点中所有页面的链接,这些页面中当前查看的页面被列为相关页面 基本设置如下所示:Django Wagtail CMS:查找与当前页面相关的所有页面,django,wagtail,Django,Wagtail,我试图了解如何通过modelcluster ParentalKey获取指向我站点中所有页面的链接,这些页面中当前查看的页面被列为相关页面 基本设置如下所示: # RelatedLink inherits from LinkFields, # both directly copied from the wagtaildemo project class ParentPageRelatedLink(Orderable, RelatedLink): page = ParentalKey('
# 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"),
]
如果理解正确,要获得每个相关链接中包含当前子页面的父页面,我必须浏览ChildPage.parent\u page\u类型中列出的每个页面,测试当前子页面是否位于ParentPage.related\u链接中,然后从每个父页面输出我需要的内容
如果父页面类型中列出了许多页面类型实例,那么对db的查询似乎会很多
有更好的办法吗
例如,modelcluster是否通过在ParentPageRelatedLink中创建的ParentalKey启用任何类型的反向引用(如Flask SQLAlchemy在使用db.relaship(backref=“something”))时提供的内容)?通过检查数据库表,它看起来不像这样
编辑
好的,看起来链接字段中的相关名称可能是实现这一点的一种方法,但由于链接字段由许多不同的类似父页面的类继承,因此我无法将其设置为类似“相关名称”的值,因此似乎我必须拥有具有其自己唯一外键的单个链接字段类(related\u name=“something”)每个父页面的定义。。。或
但是,我可能会更好地使用我最初的循环思想
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
您应该能够在
父页面
类中定义@属性
。比如:
class ParentPage(Page):
...
@property
def related_pages(self):
pages = ParentPageRelatedLink.objects.filter(page_id=self.id)
return pages
试试这个:
parent_pages = ParentPage.objects.filter(related_links__linked_page=child_page)
“related_links”取自要查询的模型上ParentalKey的related_name属性。“链接页面”是ParentPageRelatedLink模型中要筛选的字段
父页面类型与查询页面无关。它用于为特定页面类型下可以创建的页面类型添加约束(例如,您可以说只能在博客中创建博客条目)。它与页面的查询方式无关对,因此(最好的)方法是查询ChildPage.parent\u page\u类型中的所有类,并为每个类访问该属性。因为我有ParentPage1,ParentPage2,ParentPageN。。。我不知道哪些父页面将当前的子页面作为相关页面。这是我一直以来的做法……但不确定这是否是“最佳”方式。谢谢,这也是我所能想到的。这看起来效率非常低,因为每个父页面都有一个查询。但我可能会抓住几毫秒,这其实并不重要。感觉很“笨拙”。现在我意识到我也把东西混在一起了。。。父页面类型与相关页面无关。是时候重新考虑一下整个装置了。Wagtail中有一些类似的东西(都围绕着ParentalKey关系)。你可以尝试一个更明确的答案(我直接从核心团队那里得到了很好的信息)。仅供参考,Karl是Wagtail的核心开发者之一:)正如rnevius有益地指出的那样,非常欢迎你在谷歌集团问这样的问题,这是一个更仔细的监控。祝你好运谢谢,这看起来和@rnevius的建议很相似。没有办法做像ChildPage这样的事情。所有的页面都有这个ChildPage作为相关链接吗?tomd谢谢你,我会记住Google组。是的,你可以像rnevius建议的那样将上面的查询添加到ChildPage模型中:class ChildPage(Page):@属性定义所有包含此子页面的页面作为相关链接(self):返回ParentPage.objects.filter(相关链接链接页面=self)