我面临的问题是查询数量重复,这使得在Page模型上使用get_parent()或get_children()时应用程序变慢。如果父页面具有模板中使用的图像文件,则该值也会增加。

所以我正在寻找一种方法来prefetch_related页面而不建立foreign键关系。

假设我有一个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 - 在Wa尾页面中是否可能使用prefetch_related来检索相关的(父页面,子页面)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55527290/

10-11 22:42
查看更多