我在我的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>
答案 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')