实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)

394 查看

这是本系列的最后一篇,主要是select_related() 和 prefetch_related() 的最佳实践。

第一篇在这里 讲例子和select_related()

第二篇在这里 讲prefetch_related()

 

4. 一些实例

选择哪个函数

如果我们想要获得所有家乡是湖北的人,最无脑的做法是先获得湖北省,再获得湖北的所有城市,最后获得故乡是这个城市的人。就像这样:
显然这不是一个明智的选择,因为这样做会导致1+(湖北省城市数)次SQL查询。反正是个反例,导致的查询和获得掉结果就不列出来了。
prefetch_related() 或许是一个好的解决方法,让我们来看看。
因为是一个深度为2的prefetch,所以会导致3次SQL查询:
嗯…看上去不错,但是3次查询么?倒过来查询可能会更简单?