Sql 当ForeignKey null=True时Django慢速查询
我在Django模型中的一个Sql 当ForeignKey null=True时Django慢速查询,sql,django,postgresql,foreign-keys,Sql,Django,Postgresql,Foreign Keys,我在Django模型中的一个ForeignKey字段上设置了null=True,现在当我查询该模型时,速度大约慢了10倍。(我正在使用select\u related()) 查看更改前后我的Postgres日志可以找到原因: 在设置null=True之前,生成的SQL是一个带有两个内部联接的select语句 在设置null=True之后,生成的SQL省略了其中一个连接,后面跟着数千条相同的select语句 因此,这是典型的n+1查询问题,如何在ForeignKey字段上设置null=True
ForeignKey
字段上设置了null=True
,现在当我查询该模型时,速度大约慢了10倍。(我正在使用select\u related()
)
查看更改前后我的Postgres日志可以找到原因:
- 在设置
之前,生成的SQL是一个带有两个内部联接的select语句null=True
- 在设置
之后,生成的SQL省略了其中一个连接,后面跟着数千条相同的select语句null=True
因此,这是典型的n+1查询问题,如何在
ForeignKey
字段上设置null=True
而不受性能影响?您可以通过。查看在放入null=True
之前生成的查询,并通过raw
查询执行它,而不是使用“顶级django ORM”。故障的原因是ORM不支持Postgres服务器,因此您可以避免直接运行SQL代码生成无用的代码。来自官方文档,这是select\u related()
方法的限制
但是您可以在选择\u relate()
中指定相关字段,类似于
modelA.objects.select_related('ModelAForeignKeyName__RelatedModelFeildName')
您是否通过
深度
参数或字段名对select_related
进行了限制?没有限制,这会有帮助吗?也许您的细分不仅仅是因为null=True
;这是一个很好的解决方案。我试试看。