Да.Написанный вами запрос более или менее эквивалентен:
Article.objects.filter(id=some_id).prefetch_related('author')
или:
Article.objects.filter(id=some_id).select_related('author')
select_related
против prefetch_related
в случае числа Author
s ограничено, или, скорее, отношение один к одному.Если вы вытягиваете большое количество Article
с и несколько Article
с отображением на одного и того же Author
, обычно лучше использовать prefetch_related
: это сначала будет искать Author
идентификаторов, выполните фильтр уникальности и затем извлеките их в память.
То же самое сохраняется, если несколько Author
s пишут одну статью (так что один-ко-многим или отношение ко многим ).Поскольку это будет означать, что если мы выполним JOIN
на уровне базы данных, мы будем повторять каждую статью по количеству Author
с, которые написали эту статью, и мы повторяем каждую Author
по количеству Article
с, которые онинаписал.Обычно мы хотим избежать такого «мультипликативного» поведения для таких множеств.Таким образом, в этом случае prefetch_related
будет иметь линейное поведение : сначала выбираются соответствующие Article
с, затем выбираются соответствующие Author
с.
Ленивая загрузка связанных объектов
Но на самом деле вам не нужно выполнять prefetch_related
для одного экземпляра.Если вы загружаете статью, вы можете просто использовать some_article.author
.Если соответствующий экземпляр Author
еще не загружен, Django выполнит дополнительный запрос, извлекая связанный экземпляр Author
.
Таким образом, Django может загружать атрибуты, которые соответствуют связанным объектам, в lazy манера: он просто загружает Article
, если вы извлекаете его в память, и если позже вам понадобится Author
, или Journal
, или .editor
Journal
(например, Author
), Django будет каждый раз делать новый запрос и загружать связанные объекты.Однако, если вы хотите обработать список Article
в пакете, рекомендуется select_related
и prefect_related
, поскольку они приведут к ограниченному количеству запросов на выборку всех связанных объектов вместо одного запроса на связанный экземпляр.
Ленивая загрузка связанных объектов может быть более эффективной, если часто приходится извлекать ноль или самое большее несколько связанных экземпляров (например, потому что это зависит от некоторых атрибутов Article
, действительно ли мы заинтересованыв конце концов Author
).