在 Django 中使用 prefetch_related 和过滤器的顺序有关系吗?

Does it matter in which order you use prefetch_related and filter in Django?

标题说明了一切。

让我们看看这段代码为例:

objs = Model.objects.prefetch_related('model2').filter()
objs.first().model2_set.first().field

                  vs

objs = Model.objects.filter().prefetch_related('model2')
objs.first().model2_set.first().field

问题

首先使用 prefetch_related() 时,Django 是否在不考虑 .filter() 的情况下获取所有 ManyToOne/ManyToMany 关系,并在获取所有内容后应用过滤器?

IMO,没关系,因为最后还有一个查询要执行。

提前致谢。

只要在获取任何记录之前,指定 prefetch_related 的位置并不重要。我个人把 prefetch_relatedselect_related 之类的东西放在一起。 only 在链的末尾,但从代码可读性的角度来看,这对我来说更具表现力。

但并非所有管理器方法都是如此。有些方法确实会根据它们在链中的位置产生不同的效果,例如 order_bydistinct (分组依据)一起使用时可能具有位置意义。