django的orm映射,默认的是懒加载,每次只取最少量的数据,当在取querryset的过程中设计到外键的时候,django首先会去取想要的数据集,再去取外键的数据集,这样就访问了两次数据库,那取n条数据就访问了n*n次数据库.
拥有适度流量的网站,在进入真正的麻烦前也就可以负担起50次到数据库的访问。
所以一次嵌都在用你的效率在开玩笑.
- select_related
:Django ORM 最简单的预加载工具,对于所有一对一或多对一的数据关系,你都需要从同一个父对象获取数据,如客户的公司名称。这个会被翻译成 SQL 的 join 操作,这样父对象的数据就和子对象的数据一起取回来了。(参见官方文档) - prefetch_related
:对于更复杂的关系,即每个结果有多行(例如 many=True ),像多对一或多对多的数据关系,比如上述客户的订单,这转化一个二级 SQL 查询,通常有很长的 WHERE ... IN
,从中只选择相关的行。(参见官方文档) - Prefetch
:用于复杂 prefetch_related
查询,例如过滤子集。它也可以嵌套setup_eager_loading
进行调用。 (参见官方文档)