我正在尝试返回树中最新孩子的列表。 RecordPage
只能添加到特定节点,我希望在主页上添加“最新”条目的列表,但只返回每个父节点RecordPage
子节点。
我试过这样的事情:
return RecordPage.objects.distinct("parent").live().order_by("-first_published_at")[:5]
但是Django让我很难过,说模型中不存在字段父项,这是有道理的。我无法从文档中弄清楚这一点。
帮助PLZ?
答案 0 :(得分:0)
wagtailcore_page
表没有这样的字段。了解父母的唯一方法是通过path
或url_path
,但这会很难看。
但在我们尝试进入复杂的东西以使其仅在一个查询中工作之前,它可以在n + 1个查询中完成。鉴于您说RecordPage
只能添加到特定节点,我将假设这些特定节点被称为RecordIndexPage
。这样,我们就可以查询我们感兴趣的所有RecordIndexPage
,并为每个RecordPage
查询最新的record_pages = []
for index_page in RecordIndexPage.objects.all():
record_page = RecordPage.objects \
.descendant_of(index_page) \
.live() \
.order_by('-first_published_at') \
.first()
if record_page:
record_pages.append(record_page)
record_pages = sorted(record_pages, key=lambda page: page.first_published_at, reverse=True)
descendant_of,如下所示:
path
现在,如果我们想尝试在单个查询中执行此操作,我们可能会使用RecordPage
破解某些内容。我现在假设你所有的from django.db.models.functions import Substr
# Path is a string of length `depth` * 4.
# e.g. `0001` is the path of a page at depth 1, `00010003` is the path of a page at depth 2, etc.
path_step = 4
# Given the root page is always at depth 1 and the homepage is a depth 2,
# the `RecordIndexPage`s would be at depth 3.
parent_depth = 3
# Querying.
record_pages = RecordPage.objects \
.annotate(parent_path=Substr('path', 0, parent_depth * path_step)) \
.live() \
.order_by('-first_published_at') \
.distinct('parent_path')
record_pages = record_pages[:5]
都处于相同的深度,因为它会使事情变得更简单。
注意:这是一个进一步探索的想法,我没有尝试过这段代码。
List<T>