Когда выполняется SQL в Django ORM - PullRequest
0 голосов
/ 01 июня 2018

Для начала приведу пример:

# Student is a model class, and it has attributes: name, age, gender and so on.
temp_students = Student.objects.filter(age=18)
students = temp_students.filter(gender='girl')

Если я отлаживаю этот код, я могу получить SQL, который может быть "SELECT * FROM student WHERE age = 18" (называемый SQL-A).Затем, когда я достигну второй строки, я могу получить другой SQL, который "SELECT * FROM student WHERE gender = 'girl' IN (SELECT * FROM student WHERE age = 18)" (называемый SQL-B).

Итак, мой ВОПРОС - когда исполняются SQL-A и SQL-B?Он подключается к базе данных дважды и получает два набора результатов?В этом случае есть ли ненужные расходы на базу данных?Если нет, то почему я могу получить SQL-код, похожий на режим отладки?

Будет здорово, если в конце вашего ответа есть какой-нибудь связанный документ или статья по Django ORM.

СПАСИБО!

1 Ответ

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

Наборы запросов Django «ленивы» - это означает, что они выполняют операции с базой данных только после их оценки.

Например, здесь:

queryset1 = Student.objects.filter(...)
queryset2 = queryset1.filter(...)

for i in queryset2:
    print(i)

В приведенном выше примере набор запросов оценивается толькокогда он достигает цикла for, и именно тогда он фактически обращается к базе данных.Он будет использовать один SQL-запрос, построенный на основе предыдущих операторов фильтра.

Дополнительная информация в документации Django: https://docs.djangoproject.com/en/2.0/topics/db/queries/#querysets-are-lazy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...