在 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_related
、select_related
之类的东西放在一起。 only
在链的末尾,但从代码可读性的角度来看,这对我来说更具表现力。
但并非所有管理器方法都是如此。有些方法确实会根据它们在链中的位置产生不同的效果,例如 order_by
与 distinct
(分组依据)一起使用时可能具有位置意义。
标题说明了一切。
让我们看看这段代码为例:
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_related
、select_related
之类的东西放在一起。 only
在链的末尾,但从代码可读性的角度来看,这对我来说更具表现力。
但并非所有管理器方法都是如此。有些方法确实会根据它们在链中的位置产生不同的效果,例如 order_by
与 distinct
(分组依据)一起使用时可能具有位置意义。