Django ORM. Оптимизация запросов к связанным моделям с помощью select_related и prefetch_related.

preview_player
Показать описание
Частый вопрос на собеседованиях backend-разработчика.
Оптимизируйте запросы к базе данных Джанго проекта.
Хорошие ответы с примерами кода - в этом видео. Вы узнаете, как с помощью ORM писать эффективные SQL-запросы. Как их дебажить и сколько можно выиграть на хорошем запросе.

Код проекта для тренировки и обучения:

джанго дебаг тулбар

Задача:
Провести оптимизацию запросов к базе данных во вью - функции item_detail
Идеями и радостью того, что получилось с решением можно делиться в комментариях.
Пару строчек кода, скорее всего, тоже будет норм (надеюсь, гугл не будет банить).

Всем спасибо за просмотр! Ставьте 👍 если Вам понравилось видео!
Нажимайте 🔔 чтобы видеть наши новые выпуски. За подписку - отдельная благодарность

🔔ПОДПИСЫВАЙТЕСЬ:🔔

#django #select_related #prefetch_related
Рекомендации по теме
Комментарии
Автор

Благодарность спикеру, что он никуда не спешит. Спокойно, монотонно и все понятно. Это редкий случай когда я с первого раза посмотрел и во всем разобрался

kwbsquc
Автор

Андрей, не обижайтесь, но это видео - 100500е объяснение в стиле "посмотрите, вот сюда вставляем select_related, а сюда- prefetch_related и вместо 10 запросов у нас 1 или 2" . В чем ключевое отличие prefetch_related от select_related? Как они работают "под капотом"? Почему снова демонстрируется работа prefetch только для N:N ? В общем, если по select_related все относительно просто и понятно, то prefetch_related оставляет ощущение недосказанности, удивительно, что это касается 99% объяснительных статей про эти два метода.

ioannp.
Автор

Вчера столкнулся с этим! Загуглил Вы выложили) Спасибо Вам за урок!

donfedor
Автор

Безотносительно того, что у меня изначально показывает меньшее количество запросов. Самое простое - вместо "Item'" вставить уже оптимизированный querуset из первой функции.

xewuss
Автор

Добрый день Андрей. А вы не думали сделать видео о том как можно сделать например чистую архитектуру на джанго? А то тонкие вьюхи и толстые модели так себе паттерн)) model -> (repository, specifications) -> use case -> interactor -> controller -> view. А так получается по вашему видео то для того что бы бизнес логику протестировать нужно http запрос делать) Какой смысл инфраструктуру в виде моделей и http смешивать с логикой?

yuriyokal
Автор

Спасибо за видео. Очень хочется более сложных примеров, что-то с использованием класса Prefetch, так же хотелось бы рассмотреть raw и RawSQL

hbltbtd
Автор

указывая 'values' мы получаем Queryset содержащий словарь, а когда 'values' Не указываем, то Queryset содержит объекты модели. И отсюда вылезают всякие трудности в дальнейшем. Как мне показалось 'values' при использовании prefetch_related нужно НЕ указывать, т.к. результат немного не тот...

kwbsquc
Автор

пока в 2 запроса и то не нравятся они мне
item = get_object_or_404(Item.objects.select_related('category').prefetch_related('tags'), pk=item_pk) так же работает как и item = get_object_or_404(Item.objects.select_related('category'), pk=item_pk), отсюда вопрос - можно ли так совмещать селект и префетч? и главный вопрос, насколько я понял основная разница между селектом и префетчом -
это в том что селект джоинит таблицы на уровне SQL запроса, а префетч на уровне python ?

st-tnsk
Автор

Решил так, но косяк в HttpResponseNotFound: try:
item =
except:
return HttpResponseNotFound("No such element in the database")

pashadem
Автор

А в классах представления это вшито автоматически или нужно вручную настраивать?

notjik
Автор

А нельзя все эти 3, 4, 5 запросов взять и объединить в пакет и выполнить за один раз(современные скули такое позволяют)?

kqnkvjr
Автор

Подскажите, пожалуйста, на каком спринте вы проводили этот марафон?

artouralty
Автор

Какой-то препод так себе... Будто говорит, сам не знает о чем. В документации джанго очень подробно и понятно описывается про select и prefetch. Что select_related делает select(казалось бы), а prefetch это дополнительный join. Очень легко объясняется на схеме связанных таблиц, что даже если человек не знаком raw запросами, поймёт о чем речь. Ну и залитый файл на гит бд просто топ:))

scad_
Автор

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

kostya