Имеет ли значение, в каком порядке вы используете prefetch_related и filter в 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 получает все отношения ManyToOne/ManyToMany без учета .filter(), а после того, как все получено, применяется фильтр?
IMO, это не имеет значения, поскольку в конце все равно выполняется один запрос.
Заранее спасибо.
Не имеет значения, где вы указываете prefetch_related, если только это происходит до получения записей. Лично я помещаю такие вещи, как prefetch_related, select_related и only в конец цепочки, но мне это кажется более выразительным с точки зрения читаемости кода.
Но это не относится ко всем методам менеджера. Некоторые методы действительно имеют различные эффекты в зависимости от их положения в цепочке, например order_by может иметь позиционное значение при использовании с distinct (group by).