Django 访问ORM对象的属性时设置限制(SQL)

Django 访问ORM对象的属性时设置限制(SQL),django,django-models,django-orm,sql-limit,Django,Django Models,Django Orm,Sql Limit,我开始检查已执行的SQL查询,以便在Django项目中改进它们(缓存、重新格式化等) 例如,要从数据库中获取单个对象,请执行以下操作: Company.objects.filter(pk=1)[:1] 快于: Company.objects.filter(pk=1) 因为在前者中,我们限制了查找的数量。这是显而易见的,但不太明显的是如何在访问恰好是ForeignKey的模型属性时设置限制。例如,如果CompanyModel是一个模型,该模型具有一个指向Company的OneToOneFiel

我开始检查已执行的SQL查询,以便在Django项目中改进它们(缓存、重新格式化等)

例如,要从数据库中获取单个对象,请执行以下操作:

Company.objects.filter(pk=1)[:1]
快于:

Company.objects.filter(pk=1)
因为在前者中,我们限制了查找的数量。这是显而易见的,但不太明显的是如何在访问恰好是ForeignKey的模型属性时设置限制。例如,如果
CompanyModel
是一个模型,该模型具有一个指向Company的
OneToOneField
,我们尝试从主模型访问某些属性:

test = Company.objects.filter(pk=1)[:1]
profile = test.CompanyProfile.owner
为获取有关CompanyProfile的信息而执行的查询没有任何限制,因此将遍历整个表以查找尽可能多的记录。我怎样才能设置一个限制,使它不会这样做呢?

你的“优化”并不明显,我甚至怀疑这是否是一个优化

数据库通常非常擅长优化查询,特别是在这样的简单情况下。如果通过主键向数据库请求记录,它不会扫描整个数据库:而是使用该列的索引。该指数是有序的;因此,一旦数据库遇到不匹配的记录,它将立即停止扫描。绝对没有必要限制这个查询


外键查找也是如此。FK指向所有者表的主键;因此,再一次,数据库只需扫描到第一个不匹配的键。

我不确定您使用的是哪一个数据库,但在使用主键且只匹配一行的sql查询末尾添加限制1是否真的更快?我使用的是pgSQL,我想说这取决于表的大小。如果您有一个包含一百万个条目的表,并且您只想得到一个条目,那么我认为最好得到一个条目并停止寻找更多条目,因为这将消耗资源,而且毫无用处。