Поведение загрузки «связанных данных» в Django ORM - PullRequest
1 голос
/ 03 февраля 2010

В LINQ (я из C # фона) вы можете вручную загрузить данные для связанных таблиц с помощью метода Include ("xxx")

from a in ctx.MainTable.Include("SubTable")
select a;

В приведенном выше коде загружается каждый экземпляр MainTable, а также загружаются все данные для MainTable.SubTable. Если «Включить» не вызывается, каждое возвращаемое свойство SubTable объекта MainTable будет возвращать ноль.

Существуют ли эквивалентные методы для Django ORM? Если нет, каково поведение Django по умолчанию для ситуаций, подобных описанным выше?

1 Ответ

3 голосов
/ 03 февраля 2010

Смотрите это:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4

Вы создаете набор запросов select_related для отслеживания отношений и предварительной выборки связанных строк.

Обычно вы не тратите много времени на это, пока не узнаете, что отдельные выборки, автоматически выполняемые ORM, слишком медленные.

Когда вы просто называете поле связанного объекта:

x = MainTable.objects.get( id="some Object" )
y= x.subTable

ORM выполнит соответствующую строку вспомогательной таблицы. лениво.

Вы не можете легко загрузить всю таблицу в память. QuerySets являются «ленивыми» и не извлекают строки, пока нет возможных оправданий. Учти это.

for m in MainTable.objects.all():
    y = m.subTable
    if y.someAttribute > 5: 
        break

Тогда вам могут не понадобиться все объекты в MainTable. Набор запросов готов к их извлечению. Это на самом деле не приносит их всех. Вот почему мы обычно не делаем ничего, кроме x.subTable, и оставляем это ORM для выборки строки по мере необходимости.

Время от времени вы можете доказать, что это слишком медленно. Затем вы можете выполнить MainTable.objects.select_related()... и принудительно перейти к строкам в других таблицах.

...