python - 是否可以在 Wagtail 页面中使用 prefetch_related 来检索相关的(父页面、子页面)?

标签 python django wagtail

我面临的问题是重复的查询数量,这使得在页面模型上使用 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/

相关文章:

django - 如何更改父页面?

python - 如何使用python将阿拉伯语文本存储在mysql数据库中?

python - PySNMP 错误 : pysnmp. smi.error.SmiError

python - 安装到现有 Django 应用程序后如何将页面模板添加到 Wagtail

python - 为什么 django-star- ratings 在模板加载时不显示星星?

python - 如何删除 django 中级联的一对一关联模型?

python - 使用 Wagtail CMS 使用 Python 检测父页面和子页面类型

python - SQLAlchemy:相关子查询中仍然存在 FROM 条目

python - 无法查看Python OpenCV录制的视频

django - 如何手动修改从 Django 数据库检索的模型?