Выполняет ли select_related для уже запрошенного поля запрос SQL? - PullRequest
0 голосов
/ 21 ноября 2018

Предположим, что у автомобиля несколько колес, а у колеса один цвет.
Выполняет ли 4-я строка запрос SQL?

cars = Car.objects.prefetch_related('wheel_set__color')
for car in cars:
    for wheel in car.wheel_set:
        print(wheel.color)

1 Ответ

0 голосов
/ 21 ноября 2018

Ваш вопрос спрашивает о select_related (), но ваш код указывает prefetch_related (), поэтому я рассмотрю оба.

Следующее попадет в базу данных один раз:

cars = Car.objects.select_related('wheel_set__color')
for car in cars:
    for wheel in car.wheel_set:
        print(wheel.color)

Следующее будетпоразить базу данных три раза:

cars = Car.objects.prefetch_related('wheel_set__color')
for car in cars:
    for wheel in car.wheel_set:
        print(wheel.color)

Однако, следующее попадет в базу данных дважды:

cars = Car.objects.select_related('wheel_set').prefetch_related('wheel_set__color')
for car in cars:
    for wheel in car.wheel_set:
        print(wheel.color)

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#select-related

...