13

select_related 如何与具有多个外键的模型一起使用?它只是选择第一个吗?

类模型:fkey1、fkey2、fkey3...

文档没有说明这一点,至少没有在指定方法的地方说明。

注意:也许我是唯一会感到困惑的人。我猜 select_related 只是一个性能提升器(我可以看到),但我错误地认为它是别的东西。

4

3 回答 3

15

您可以select_related中使用如下

Comment.objects.select_related('user').select_related('article').all()
于 2015-12-24T04:09:51.680 回答
7

相反,文件对此事非常清楚。它说默认情况下所有 ForeignKeys 都被遵循,但你可以给方法一个字段列表,它只会遵循这些关系。

于 2013-01-17T18:25:32.003 回答
7

如果您的模型有多个外键,您可以:

  • Call .select_related(),它将“遵循”所有 非空外键关系
  • Call .select_related('foreign_key1', 'foreign_key2', ...),它只会“跟随”作为参数提供的外键。

请注意,“遵循 FK 关系”意味着在执行查询时(通过执行 SQL 连接)选择其他相关对象数据。这将使主查询更重,但可以用来避免N+1 查询问题

根据select_related文档,不推荐使用第一种方法(不带参数),因为“它可能会使底层查询更复杂,并返回比实际需要更多的数据”。


如果您的模型具有与其他模型(即Book <>-- Author <>-- Hometown)“嵌套”的外键,您也可以使用select_related如下:

  • 调用Book.select_related('author__hometown'),它将“跟随”作者的外键(在 Book 模型中)和家乡的外键(在 Author 模型中)。

如果您的模型具有您想从数据库中检索的多对多或多对一关系,您应该查看prefetch_related

于 2020-11-10T20:40:06.173 回答