prefetch_related()
用法其实与select_related()方法一样》》链接select_related》》https://blog.csdn.net/h18208975507/article/details/102783921
对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。或许你会说,没有一个叫OneToManyField的东西啊。实际上 ,ForeignKey就是一个多对一的字段,而被ForeignKey关联的字段就是一对多字段了
作用和方法
prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,在SQL查询内解决问题。但是对于多对多关系,使用SQL语句解决就显得有些不太明智,因为JOIN得到的表将会很长,会导致SQL语句运行时间的增加和内存占用的增加。若有n个对象,每个对象的多对多字段对应Mi条,就会生成Σ(n)Mi 行的结果表。
小结
- 因为
select_related()
总是在单次SQL查询中解决问题,而prefetch_related()
会对每个相关表进行SQL查询,因此select_related()
的效率通常比后者高。 - 鉴于第一条,尽可能的用
select_related()
解决问题。只有在select_related()
不能解决问题的时候再去想prefetch_related()
。 - 你可以在一个QuerySet中同时使用
select_related()
和prefetch_related()
,从而减少SQL查询的次数。 - 只有
prefetch_related()
之前的select_related()
是有效的,之后的将会被无视掉。