Имеет ли значение, в каком порядке вы используете 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).

Вернуться на верх