Django在ForeignKey为null=True时查询速度变慢

5
我在我的Django模型中的一个ForeignKey字段上设置了null=True,现在当我查询该模型时,它大约慢了10倍。(我正在使用select_related())。在更改之前和之后查看我的Postgres日志可以找到原因的线索:
在设置null=True之前,生成的SQL是一个带有几个内部连接的单个选择语句。
在设置null=True之后,生成的SQL省略了其中一个连接,并代之以数千个相同的选择语句。
所以这是经典的n+1查询问题,在此得到解决之前,我如何在ForeignKey字段上设置null=True而不影响性能?

你是否已通过depth参数或字段名称限定了select_related的范围? - trinchet
没有限制,这样有帮助吗? - Gady
也许你的问题不仅仅是null=True - trinchet
2个回答

1
你可以通过 原始查询 来解决这个问题。在加入 null=True 之前看一下生成的查询,然后通过 原始查询(raw) 来执行它,而不是使用“顶级 Django ORM”。ORM 与 Postgres 服务器不兼容,因此您可以直接运行 SQL 代码来避免无用的代码生成。

这是一个不错的解决方案。我会尝试一下。 - Gady

0

根据官方文档,这就是 select_related() 方法的限制,详细信息请点击此处

但是你可以在 select_related() 中指定相关字段,例如:

modelA.objects.select_related('ModelAForeignKeyName__RelatedModelFeildName')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接