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