Когда Django выполняет поиск в базе данных? - PullRequest
2 голосов
/ 10 ноября 2009

Из следующего кода:

dvdList = Dvd.objects.filter(title = someDvdTitle)[:10]

for dvd in dvdList:
    result = "Title: "+dvd.title+" @ "+dvd.price+"."

Когда Джанго выполняет поиск? Может быть, это просто паранойя, но, кажется, если я закомментирую цикл for, он вернется намного быстрее. В первой строке настраивается фильтр, а затем цикл for выполняет его, или я полностью запутался? Что на самом деле происходит с этими строками кода?

EDIT:

Что бы произошло, если бы я ограничил object.filter значением '1000', а затем реализовал счетчик в цикле for, который вышел из него после 10 итераций. Будет ли это эффективно получить только 10 значений или 1000?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2009

Наборы запросов Django оцениваются лениво, так что да, запрос фактически не будет выполняться, пока вы не попытаетесь получить значения из него (как вы делаете в цикле for).

Из документов:

Вы можете оценить QuerySet следующими способами:

итерация . QuerySet является итеративным, и он выполняет свой запрос к базе данных в первый раз вы перебираете это. За Например, это напечатает заголовок всех записей в базе данных:

for e in Entry.objects.all():
    print e.headline

... (чик) ...

См. Когда оцениваются наборы запросов .

По вашему редактированию:

Если вы ограничите фильтр до 1000, а затем внедрите счетчик в цикле for, который вышел из него после 10 итераций, то вы попадете в базу данных для всех 1000 строк - Django не может точно знать заранее что вы собираетесь делать с Queryset - он просто знает, что вы хотите получить из него некоторые данные, поэтому оценивает строку запроса, которую он построил.

0 голосов
/ 02 октября 2016

Также может быть полезно оценить все сразу, используя list() или любой другой метод оценки запроса. Я считаю, что это иногда повышает производительность (не платя за подключения к БД каждый раз).

Подробнее о том, когда django оценивает здесь .

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