Как работает отложенная оценка в запросе django? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть сомнения относительно ленивых вычислений в наборах django-запросов.

Это мой запрос django:

Метод1:

tyres_in_car = Car.objects.filter(serial_no__startswith('AB')).values('tyre__type')

В этом запросе я получаю доступ к значениям внешнего ключа, используя в этом случае .values() (тип шины).

Другой используемый мной подход:

Метод2:

Строка1: tyres = Car.objects.filter(serial_no__startswith('AB'))

Строка2: all_tyres = tyres.tyre.all()

Строка3: tyres_in_car = [ ty.type for ty in all_tyres ]

С тех пор, как япри использовании .values() в обоих методах запрос достигает базы данных только один раз в обоих случаях (из-за ленивой оценки в случае метода 2) или два раза в случае метода 2.

ИзС точки зрения читабельности кода, метод 2 выглядит более подходящим, на мой взгляд.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Изучив некоторое время различные посты, я не смог найти ни одного решения.

Итак, я решил профилировать запросы самостоятельно.

Сгенерированный запрос для Method1 является одним запросом:

SELECT "I_tyre"."type" FROM "I_car" LEFT OUTER JOIN "I_car_tyre" ON ("I_car"."id" = "I_car_tyre"."car_id") LEFT OUTER JOIN "I_tyre" ON ("I_car_tyre"."tyre_id" = "I_tyre"."id") WHERE "I_car"."id" = 1 LIMIT 21', 'time': '0.000'

А для Метод2 есть 2 запроса:

query1: 'SELECT "I_car"."id", "I_car"."serial_no" FROM "I_car" WHERE "I_car"."id" = 1'

query2: 'SELECT "I_tyre"."id", "I_tyre"."type" FROM "I_tyre" INNER JOIN "I_car_tyre" ON ("I_tyre"."id" = "I_car_tyre"."tyre_id") WHERE "I_car_tyre"."car_id" = 1'

0 голосов
/ 27 апреля 2019

Лучший способ, чем оба, - это сначала запросить шины.

Tyre.objects.filter(car__serial_no__startswith='AB').values('type')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...