Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当ForeignKey null=True时Django慢速查询_Sql_Django_Postgresql_Foreign Keys - Fatal编程技术网

Sql 当ForeignKey null=True时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

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

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

  • 在设置
    null=True
    之前,生成的SQL是一个带有两个内部联接的select语句
  • 在设置
    null=True
    之后,生成的SQL省略了其中一个连接,后面跟着数千条相同的select语句

因此,这是典型的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
;这是一个很好的解决方案。我试试看。