Джанго получает объекты внешнего ключа - PullRequest
0 голосов
/ 05 июня 2018

Я из .NET Core, и мне любопытно, есть ли у Django что-то похожее на проекции .NET Core.Например, я могу описать отношение в модели .NET Core, а затем запросить его.Таким образом, если у Articles может быть Author, я могу сделать что-то вроде:

var articles = dbContext.Where(article.ID == id).Inclue(a => a.author);

Что я хотел бы получить, так это статьи, к которым прикреплен их автор.

Есть ли что-то похожее на это в Django?Как я могу загрузить связанные данные в Django, которые описаны в модели?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Да.Написанный вами запрос более или менее эквивалентен:

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).

0 голосов
/ 05 июня 2018

Звучит так, будто вы ищете select_related .Это пересекает отношения FK, основанные на том, как они создаются в ваших моделях.

...