prefetch_related
нельзя использовать для отношений родительских / дочерних страниц, поскольку они не используют стандартное отношение Django ForeignKey
- вместо этого Wagtail (и Treebeard) использует поле path
для представления позиции дерева.Это позволяет выполнять запросы, которые не могут быть эффективно выполнены с ForeignKey
, такие как выборка всех потомков (на любой глубине) страницы.
Следует отметить, что prefetch_related
не«свободный» - генерирует один дополнительный запрос для каждого последующего отношения.Методы запросов Treebeard обычно равны или лучше по эффективности, например:
series = TvSeries.objects.get(id=123)
episodes = series.get_children()
извлечет TvSeries
и все его эпизоды в двух запросах, как (гипотетический) prefetch_related
выражение будет:
# fake code, will not work...
series = TvSeries.objects.filter(id=123).prefetch_related('child_pages')
Однако одна проблема с get_children
заключается в том, что он будет возвращать только базовые Page
экземпляры, поэтому для извлечения определенных полей из Episode
требуются дополнительные запросы.Вы можете избежать этого, используя child_of
вместо:
series = TvSeries.objects.get(id=123)
episodes = Episode.objects.child_of(series)