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

  Рет қаралды 24,123

Андрей += Пронин

Андрей += Пронин

Күн бұрын

Частый вопрос на собеседованиях backend-разработчика.
Оптимизируйте запросы к базе данных Джанго проекта.
Хорошие ответы с примерами кода - в этом видео. Вы узнаете, как с помощью ORM писать эффективные SQL-запросы. Как их дебажить и сколько можно выиграть на хорошем запросе.
Код проекта для тренировки и обучения:
github.com/Cap...
джанго дебаг тулбар
django-debug-t...
Задача:
Провести оптимизацию запросов к базе данных во вью - функции item_detail
Идеями и радостью того, что получилось с решением можно делиться в комментариях.
Пару строчек кода, скорее всего, тоже будет норм (надеюсь, гугл не будет банить).
Всем спасибо за просмотр! Ставьте 👍 если Вам понравилось видео!
Нажимайте 🔔 чтобы видеть наши новые выпуски. За подписку - отдельная благодарность
🔔ПОДПИСЫВАЙТЕСЬ:🔔
🔗Вконтакте: CaptPronin
🔗Facebook: / proninc
#django #select_related #prefetch_related

Пікірлер: 44
@ioannp.5274
@ioannp.5274 2 жыл бұрын
Андрей, не обижайтесь, но это видео - 100500е объяснение в стиле "посмотрите, вот сюда вставляем select_related, а сюда- prefetch_related и вместо 10 запросов у нас 1 или 2" . В чем ключевое отличие prefetch_related от select_related? Как они работают "под капотом"? Почему снова демонстрируется работа prefetch только для N:N ? В общем, если по select_related все относительно просто и понятно, то prefetch_related оставляет ощущение недосказанности, удивительно, что это касается 99% объяснительных статей про эти два метода.
@AndyPronin
@AndyPronin 2 жыл бұрын
Спасибо за фидбек. Я уже подумываю переписать это дело.
@GOoD-vd5et
@GOoD-vd5et Жыл бұрын
Зачем вам видео, когда у Джанги есть документация. "Почему снова демонстрируется работа prefetch только для N:N ? " В этом вопросе подразумевается связь m2m? Может потому что prefetch_related используется для m2m, а select_related в связях OneToOne и Foreign, не? Что за претензии непонятные.
@ioannp.5274
@ioannp.5274 Жыл бұрын
@@GOoD-vd5et я уже не помню, что имел в виду, но скорее всего то, что джанго никак не запрещает использовать prefetch_related не только к m2m, но и к остальным типам связей. Думаю меня волновало, что происходит в этом случае и почему так делать нельзя или можно.
@АлишерИвазов
@АлишерИвазов Жыл бұрын
Чел сидит в кимоно?)))))
@xewuss3750
@xewuss3750 2 жыл бұрын
Безотносительно того, что у меня изначально показывает меньшее количество запросов. Самое простое - вместо "Item'" вставить уже оптимизированный querуset из первой функции.
@st-tn5sk
@st-tn5sk 2 жыл бұрын
пока в 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 ?
@GOoD-vd5et
@GOoD-vd5et Жыл бұрын
Да, префетч на уровне питона. Если сделать джойн с таблицей со связью m2m, то будет дублирование строк, поэтому через SQL это сделать нельзя. В любом случае получается 2 запроса, если хотим все поля. Вопрос в автору, зачем поставил такое задание, может сам не был уверен.
@donpatron3631
@donpatron3631 2 жыл бұрын
Спасибо за инфу о Джанго-Тул-Бар.
@AndyPronin
@AndyPronin 2 жыл бұрын
не перключайтесь. постараюсь подтягивать интересное
@ПуляевГригорий
@ПуляевГригорий Жыл бұрын
Спасибо. Поржал.
@yuriyokal7307
@yuriyokal7307 Жыл бұрын
Добрый день Андрей. А вы не думали сделать видео о том как можно сделать например чистую архитектуру на джанго? А то тонкие вьюхи и толстые модели так себе паттерн)) model -> (repository, specifications) -> use case -> interactor -> controller -> view. А так получается по вашему видео то для того что бы бизнес логику протестировать нужно http запрос делать) Какой смысл инфраструктуру в виде моделей и http смешивать с логикой?
@МихаилГусев-э4с
@МихаилГусев-э4с 8 ай бұрын
А нельзя все эти 3,4, 5 запросов взять и объединить в пакет и выполнить за один раз(современные скули такое позволяют)?
@donfedor007
@donfedor007 2 жыл бұрын
Вчера столкнулся с этим! Загуглил Вы выложили) Спасибо Вам за урок!
@AndyPronin
@AndyPronin 2 жыл бұрын
Скоро ещё будет очень клёвый урок
@УмарШирваниев-в7ь
@УмарШирваниев-в7ь 2 жыл бұрын
👍🏻👍🏻👍🏻
@pashadem5820
@pashadem5820 Жыл бұрын
Решил так, но косяк в HttpResponseNotFound: try: item = Item.objects.all().select_related('category').prefetch_related('tags').get(pk=item_pk) except: return HttpResponseNotFound("No such element in the database")
@AndyPronin
@AndyPronin Жыл бұрын
ох. Прям сложно. Препишу-ка я это видео. Кажется, там сильно лучше можно всё.
@dt_sevatarion
@dt_sevatarion Жыл бұрын
640х480???
@lx5.47lk2
@lx5.47lk2 Жыл бұрын
Топчик!!
@AndyPronin
@AndyPronin Жыл бұрын
На самом деле, нет. Мне за это видео очень стыдно. Запишу на канале от мидла и выше улучшенное и переоаботанное
@notjik
@notjik Жыл бұрын
А в классах представления это вшито автоматически или нужно вручную настраивать?
@СергейГоцин
@СергейГоцин Жыл бұрын
указывая 'values' мы получаем Queryset содержащий словарь, а когда 'values' Не указываем, то Queryset содержит объекты модели. И отсюда вылезают всякие трудности в дальнейшем. Как мне показалось 'values' при использовании prefetch_related нужно НЕ указывать, т.к. результат немного не тот...
@katsuyorii
@katsuyorii 10 ай бұрын
Только что столкнулся с этим, когда хотел вытащить изображение из модели, посредством values, но он возвращал просто имя файла как я понял, без указания media пути.
@СергейГоцин
@СергейГоцин Жыл бұрын
Благодарность спикеру , что он никуда не спешит. Спокойно, монотонно и все понятно. Это редкий случай когда я с первого раза посмотрел и во всем разобрался
@oleg-petrov-diada
@oleg-petrov-diada 7 ай бұрын
Благодарю за видео, очень полезно!
@ibrahimoglu
@ibrahimoglu 2 жыл бұрын
Очень крутая тема, спасибо за стрим.
@artouralty4658
@artouralty4658 2 жыл бұрын
Подскажите, пожалуйста, на каком спринте вы проводили этот марафон?
@AndyPronin
@AndyPronin 2 жыл бұрын
Думаю, 4й
@artouralty4658
@artouralty4658 2 жыл бұрын
@@AndyPronin Обидно( Мы уже на 6-м, а про select_related и prefetch_related было только пару строк в теории
@kostya2186
@kostya2186 2 жыл бұрын
Благодарен за труд, однако слишком душно... ни то ни се. никакой конкретики что, как и почему...
@AndyPronin
@AndyPronin 2 жыл бұрын
Спасибо за отзыв. Я планирую переписать ролик. Больше на запросы образщать внимание, а не на синатксис Джанго ОРМ.
@tesmanit
@tesmanit Жыл бұрын
@@AndyPronin здравствуйте. Вы уже перезаписали видео? Если да, то как его можно найти?
@AndyPronin
@AndyPronin Жыл бұрын
@@tesmanit ещё нет. ( пока только для практикума уроки написал.
@Viktor-g8g
@Viktor-g8g 2 жыл бұрын
Спасибо за видео. Очень хочется более сложных примеров, что-то с использованием класса Prefetch, так же хотелось бы рассмотреть raw и RawSQL
@AndyPronin
@AndyPronin 2 жыл бұрын
Будет. Как раз готовлю материал
@scad_
@scad_ 2 жыл бұрын
Какой-то препод так себе... Будто говорит, сам не знает о чем. В документации джанго очень подробно и понятно описывается про select и prefetch. Что select_related делает select(казалось бы), а prefetch это дополнительный join. Очень легко объясняется на схеме связанных таблиц, что даже если человек не знаком raw запросами, поймёт о чем речь. Ну и залитый файл на гит бд просто топ:))
@ioannp.5274
@ioannp.5274 2 жыл бұрын
Что есть "дополнительный джойн"? Не встречал такого термина.
@scad_
@scad_ 2 жыл бұрын
@@ioannp.5274 почитайте документацию, встретите
@databox4279
@databox4279 9 ай бұрын
что не так с залитой бд на гит, если это СПЕЦИАЛЬНО СОЗДАННЫЙ УЧЕБНЫЙ ПРОЕКТ!!!??? Экономия времени на миграциях, добавлении объектов в базу, которая будет стерта один фиг удалена после выполнения урока.
@scad_
@scad_ 9 ай бұрын
@@databox4279 причём тут залитый файл в репо в контексте миграций? В .gitignore добавление одной строчки *.db решает этот вопрос. Вы бы прежде чем вещать, попытались бы хотя бы соотнести то, что пытаетесь сказать. А то прочитанное выглядит как чушь
@databox4279
@databox4279 9 ай бұрын
@@scad_ Вы вменяемый? Файл БД залит СПЕЦИАЛЬНО, что бы ученикам не пришлось создавать базу и наполнять её вручную. Это так сложно осознать?
Django ORM пишем правильные запросы | Django School
1:07:18
Django School | Михаил Омельченко
Рет қаралды 20 М.
РОДИТЕЛИ НА ШКОЛЬНОМ ПРАЗДНИКЕ
01:00
SIDELNIKOVVV
Рет қаралды 1,8 МЛН
Новый уровень твоей сосиски
00:33
Кушать Хочу
Рет қаралды 5 МЛН
Подготовка к собесу - Оптимизация запросов
25:12
FastAPI, Flask or Django - Which Should You Use?
9:49
Tech With Tim
Рет қаралды 86 М.
Вся база SQL для начинающих за 1 час
1:19:48
Vlad Mishustin
Рет қаралды 290 М.
Оптимизация Django. 3 - Оптимизация ORM-query
35:38
Senior Pomidor Developer
Рет қаралды 10 М.
Зачем нужны select_related и prefetch_related [Upper Junior]
17:05
Павлин Шарит - ИТ вместе с Николаем Павлиным
Рет қаралды 479
РОДИТЕЛИ НА ШКОЛЬНОМ ПРАЗДНИКЕ
01:00
SIDELNIKOVVV
Рет қаралды 1,8 МЛН