当ForeignKey null = True时,Django慢查询

时间:2013-01-16 19:50:40

标签: sql django postgresql foreign-keys

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

在更改之前和之后查看我的Postgres日志提供了原因的线索:

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

这是经典的 n + 1 查询问题和until this is fixed,如何在null=True字段上设置ForeignKey而不会影响性能?< / p>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

从官方文件来看,这是select_related()方法的限制,here is the details

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

modelA.objects.select_related('ModelAForeignKeyName__RelatedModelFeildName')