Django / Wagtail - 只有父母的第一页

时间:2018-04-07 20:24:30

标签: python django wagtail

我正在尝试返回树中最新孩子的列表。 RecordPage只能添加到特定节点,我希望在主页上添加“最新”条目的列表,但只返回每个父节点RecordPage子节点。

我试过这样的事情:

return RecordPage.objects.distinct("parent").live().order_by("-first_published_at")[:5]

但是Django让我很难过,说模型中不存在字段父项,这是有道理的。我无法从文档中弄清楚这一点。

帮助PLZ?

1 个答案:

答案 0 :(得分:0)

wagtailcore_page表没有这样的字段。了解父母的唯一方法是通过pathurl_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>