我面临的问题是重复的查询数量,这使得在页面模型上使用 get_parent() 或 get_children() 时应用程序变慢。如果父页面具有模板中使用的图像文件,它也会增加。
所以我正在寻找一种无需建立外键关系即可预取相关页面的方法。
假设我有一个 TvSeries 页面模型和一个剧集页面模型:
class TvSeries(Page):
name = models.CharField()
producer = models.CharField()
subpage_types = ['Episode']
class Episode(Page):
title = models.CharField()
number = models.CharField()
parent_page_types = ['TvSeries']
查询剧集模型时需要预取TvSeries!如何减少数据库调用?是否可以使用预取和选择相关?如果是的话怎么办?如果不是,那么解决查询数量增加的方法是什么?
最佳答案
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)
关于python - 是否可以在 Wagtail 页面中使用 prefetch_related 来检索相关的(父页面、子页面)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55527290/