Пропуски Middle Django ORM и N+1 обновлено

Prefetch с вложенным select_related

Вопрос

Допишите запрос: заказы с клиентом одним JOIN и позициями, у которых сразу подгружен товар.

from django.db.models import Prefetch

orders = (
    Order.objects
    .__(1)__('customer')
    .__(2)__(
        __(3)__('items', queryset=Item.objects.select_related('product'))
    )
)

Попробуйте сами

Заполните пропуски по номерам.

1
2
3
Показать ответ и разбор

Коротко

Клиент это ForeignKey, поэтому selectrelated. Позиции это обратная связь «ко многим», поэтому prefetchrelated, а Prefetch позволяет задать для них свой QuerySet со selectrelated("product").

Что в пропусках

1

select_related

2

prefetch_related

3

Prefetch

Разбор

Клиент это ForeignKey, поэтому select_related. Позиции это обратная связь «ко многим», поэтому prefetch_related, а Prefetch позволяет задать для них свой QuerySet со select_related("product"). Итого три запроса на любое число заказов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.