django select_related用于多个外键

dtc*_*dtc 9 django django-select-related

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

class Model:fkey1,fkey2,fkey3 ......

文档没有说明这一点,至少没有说明方法的位置.

Mar*_*nte 12

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

\n
    \n
  • 调用.select_related(),这将 \xe2\x80\x9cfollow\xe2\x80\x9d所有 非空外键关系
  • \n
  • 调用.select_related(\'foreign_key1\', \'foreign_key2\', ...),这将仅 \xe2\x80\x9cfollow\xe2\x80\x9d 作为参数提供的外键。
  • \n
\n

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

\n

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

\n
\n

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

\n
    \n
  • 调用Book.select_related(\'author__hometown\'),这将 \xe2\x80\x9c 跟随 \xe2\x80\x9d 作者的外键(在 Book 模型中)和家乡的外键(在 Author 模型中)。
  • \n
\n
\n

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

\n


Che*_*mer 8

您可以select_related中使用如下

Comment.objects.select_related('user').select_related('article').all()
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚起见,“用户”和“商品”都是“评论”上的ForeignKey字段。上面的内容相当于`Comment.objects.select_related('user','article')。all()`。(上下文:我正在研究是否可以跨多个关系`select_related()`。以上内容并不能做到这一点。) (4认同)

Dan*_*man 5

相反,有关此问题的文档非常清楚。它说默认情况下,所有的ForeignKeys都被遵循,但是您可以给该方法一个字段列表,它只会遵循那些关系。