5

我在我的 Django 模型中设置null=True了一个ForeignKey字段,现在当我查询该模型时,它慢了大约 10 倍。(我正在使用select_related()

在更改前后查看我的 Postgres 日志可以找到原因的线索:

  • 设置之前null=True,生成的 SQL 是带有几个内部连接的单个 select 语句。
  • 设置null=True,生成的 SQL 会忽略其中一个连接,而后跟数千个相同的 select 语句。

所以这是经典的n+1查询问题,在解决此问题之前,如何null=TrueForeignKey不影响性能的情况下设置字段?

4

2 回答 2

1

您可以通过原始查询来解决这个问题。查看在通过查询而不是使用“顶级 django ORM”放置null=True和执行之前生成的查询。raw故障是由于 ORM 不是 Postgres 服务器,因此您可以避免直接运行 SQL 代码的无用代码生成。

于 2013-01-17T16:00:02.077 回答
0

从官方文档来看,就是select_related()方法的限制,这里是详细的

但是您可以在 中指定相关字段select_relate(),例如

modelA.objects.select_related('ModelAForeignKeyName__RelatedModelFeildName')
于 2013-05-10T14:41:47.187 回答