使用select_related方法虽然能提升性能,但终究做了一次连表查询,在同等条件下,连表查询性能是低于单表查询的。所以prefetch_related就应运而生了。它会先执行子表的查询,然后通过计算得出结果关键外键的唯一值列表(可以理解为对所有关联外键进行set操作去除重复值),然后通过IN条件再从关联表中查询数据并放到内存中。示例如
注意:select_related() 仅作用于 ForeignKey 和 OneToOne,如果是 ManyToMany 字段,则需要用到下面的 prefetch_related() 函数。 prefetch_related() prefetch_related() 和 select_related() 作用类似,都是通过减少查询的次数,来实现查询优化。 但prefetch_related() 是针对 ManyToMany 的操作。 举个例子: fromdja...
prefetch_related() 和 select_related() 作用类似,都是通过减少查询的次数,来实现查询优化。 但prefetch_related() 是针对 ManyToMany 的操作。 举个例子: from django.db import modelsclass Topping(models.Model): name = models.CharField(max_length=30)class Pizza(models.Model): name = models.CharField(...
Django考虑到了这一点,所以提供select_related和prefetch_related方法来提升数据库查询效率,类似于SQL的JOIN方法。 select_related方法 select_related将会根据外键关系(注意: 仅限单对单和单对多关系),在执行查询语句的时候通过创建一条包含SQL inner join操作的SELECT语句来一次性获得主对象及相关对象的信息。现在我们...
prefetch_related方法 对于多对多字段,你不能使用select_related方法,这样做是为了避免对多对多字段执行JOIN操作从而造成最后的表非常大。Django提供了prefect_related方法来解决这个问题。prefect_related可用于多对多关系字段,也可用于反向外键关系(related_name)。我们对之前的article_list视图函数再做进一步修改,在查询文...
prefetch_related() 和 select_related() 作用类似,都是通过减少查询的次数,来实现查询优化。 但prefetch_related() 是针对 ManyToMany 的操作。 举个例子: from django.db import models class Topping(models.Model): name = models.CharField(max_length=30) ...
目录 收起 select_related prefetch_related() 本文首发于公众号:Hunter后端 原文链接:Django笔记十一之外键查询优化select_related和prefetch_related 本篇笔记目录如下: select_related prefetch_related 在介绍 select_related 和 prefetch_related 这两个函数前,我们先来看一个例子。 对于,Entry 和 Blog 这两...
您可以将 prefetch_related 用于任何您可以使用 select_related 的东西。 权衡是 prefetch_related 必须创建 ID 列表并将其发送回服务器,这可能需要一段时间。我不确定在交易中是否有这样做的好方法,但我的理解是 Django 总是只发送一个列表并说 SELECT … WHERE pk IN (…,…,…)基本上。在这种情况下,如果...
1select_related 2prefetch_related 在介绍 select_related 和 prefetch_related 这两个函数前,我们先来看一个例子。 对于,Entry 和 Blog 这两个 model,前面介绍过,Blog 是 Entry 的外键,如下: Plain Text 复制代码 99 1 2 3 4 5 6 7 8
select_related主要针一对一和多对一关系进行优化,产生一次查询,使用SQL的JOIN语句进行优化 三、prefetch_related 这个方法和select_related非常类似,就是在访问多个表中数据的时候,减少查询的次数,这个方法是为了解决多对一和多对多的关系的查询问题 创建两张表 ...