Соединение с Django DB: массив объектов запроса или только ссылка? - PullRequest
0 голосов
/ 24 ноября 2011

Допустим, у меня есть код:

obj = MyUser.objects.get(pk=1)

name = obj.name
age = obj.age
email = obj.email
phone = obj.phone
city = obj.city

Итак, у меня есть obj. Это массив со всей информацией об объекте MyUser или это только ссылка?

Мне интересно, name = obj.name отправляет первый запрос в БД,

age = obj.age отправляет второй запрос в БД,

email = obj.email отправляет третий запрос в БД,

phone = obj.phone отправляет четвертый запрос в БД,

city = obj.city отправляет пятый запрос в БД

или существует только один запрос, когда obj = MyUser.objects.get(pk=1).

Не секрет, что это влияет на производительность системы, поэтому это очень интересный вопрос.

Спасибо!

1 Ответ

1 голос
/ 24 ноября 2011

Это ни то, ни другое: это объект, значения которого инициализируются из базы данных, когда он создается. Django по умолчанию делает выбор для всей строки и использует значения столбца для создания экземпляра объекта.

Делать так, как вы описываете, было бы очень странно и крайне неэффективно. А что будет, если вы попросите набор запросов? Один запрос на столбец в строке?

Конечно, вы можете запросить только определенные столбцы, используя values или values_list, чтобы просто получить те, которые вас интересуют, или используя defer или only, чтобы получить объект с некоторыми отложенных полей.

Обратите внимание, что вы можете спросить Django, что он делает - в оболочке, в режиме отладки, выполните

from django.db import connection
print connection.queries

, который выдаст вам список всех запросов к базе данных до этой точки в этом сеансе оболочки.

...