Оптимизация Django. 3 - Оптимизация ORM-query

  Рет қаралды 10,362

Senior Pomidor Developer

Senior Pomidor Developer

Күн бұрын

Пікірлер: 105
@nikez600
@nikez600 Жыл бұрын
Спасибо, за урок. Такой код сделает только один запрос в бд в приведенном в видео случае с нужными полями queryset = Subscription.objects.all().select_related('plan', 'client', 'client__user').only( 'client__user__email', 'client__company_name', 'plan_id', )
@koloboopsik
@koloboopsik Жыл бұрын
Прикольно, что внутри Prefetch можно сделать select_related, это полезно
@bernardsoul8936
@bernardsoul8936 6 ай бұрын
Большое спасибо за урок! Благодаря ему в моем пет проекте теперь нет проблемы n+1, а кол-во запросов снизилось с 20+ до 6
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 6 ай бұрын
Супер! Рад что помогло
@Bibliophilos
@Bibliophilos Жыл бұрын
Выходные здорового человека - курс от Алексея :)
@Igor160594
@Igor160594 Жыл бұрын
вы серьезна? здорового? самого-самого нормального здорового человека? потратить выходные на этот курс...
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
А вы чем в выходные занимаетесь?
@ВладКалина-у5ь
@ВладКалина-у5ь Жыл бұрын
Про prefetch_related знал, но про сам класс Prefetch и отдельную выборку полей круто)
@Alekseyild
@Alekseyild Жыл бұрын
Огромное количество полезнейшей инфы понятнейшим языком. Просто топ.
@nvkey
@nvkey 8 ай бұрын
Наглядно и понятно, спасибо!
@Pavel-er4hy
@Pavel-er4hy Жыл бұрын
Отличное видео. Шаг за шагом всё работает при повторении на собственном компьютере. Благодарность автору.
@alexdzehil7194
@alexdzehil7194 Жыл бұрын
100% нужная тема, с ростом количества записей в бд рано или поздно это придется делать.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Ага. Особенно когда одним prefetch можно вместо 500 запросов сделать 1.
@airguy5964
@airguy5964 Жыл бұрын
Очень крутой и полезный видос
@unaibekovbakhyt6517
@unaibekovbakhyt6517 Жыл бұрын
Спасибо за озвучку интересных тем
@davidsaidov8308
@davidsaidov8308 2 ай бұрын
Привет, урок полезный, очень понравился. Хотелось бы еще более подробный разбор разницы между select_related и prefetch_related - когда и что использовать на разных примерах. Спасибо!
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 2 ай бұрын
Привет! Да тут особо нечего рассказывать. Select related если связываем с одним объектом, как это в Foreign Key, а если на той стороне много объектов и связь Many to Many значит prefetch related .
@davidsaidov8308
@davidsaidov8308 2 ай бұрын
@@SeniorPomidorDeveloper спасибо!
@Developer_python_
@Developer_python_ 8 ай бұрын
Тимлиду подкинулы твой курс- теперь пересматриваю опять чтобы внедрить в проект) Спасибо!
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 8 ай бұрын
Хороший у вас тимлид! 😁
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
Спасибо большое. Очень доступно. Я бы с удовольствием глянул видео про тестирование проектов на Джанго
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Спасибо вам. Есть одно видео про юнит тесты. В синем курсе. Но там достаточно базовая информация. Про тестировании логики сложно рассказать без реального приложения
@АлексейКомаров-ф8к
@АлексейКомаров-ф8к Жыл бұрын
@@SeniorPomidorDeveloper хотелось бы именно полноценнный курс. Может быть, когда будет время, сделаете ☺️
@kleancloan3536
@kleancloan3536 2 ай бұрын
Спасибо за очень хороший урок, попробовал сам на линуксе запустить через curl по локалхосту, в итоге выдал более чистые данные без "django session key" и "auth_user", сократив кол-во запросов, но это не главное, главное что попробовал поиграться с select_related и в начале сджоинить с "plan" таблицей а потом уже через класс Prefetch с тонкой настройкой еще раз сджоинить "client" c "user", где по итогу получил два запроса вместо трех. Но я что-то сомневаюсь что это что-то оптимизировало так как конкретные значения по кол-ву времени так и не видно точно. queryset = Subscription.objects.select_related('plan') .prefetch_related(Prefetch('client', queryset=Client.objects.select_related('user').only('company_name', 'user__email')))
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 2 ай бұрын
Спасибо за просмотр и комментарий! Тут конечно не будет видно оптимизации, пока мы тестируем на не нагруженном приложении практически без данных . А на реальных проектах будет видно сразу. А на нагруженных еще и деньги на мощности нам сэкономит.
@kleancloan3536
@kleancloan3536 2 ай бұрын
@@SeniorPomidorDeveloper , Я имел ввиду что конкретно моя попытка оптимизации была бы лучше представленной у вас, так-то оптимизацию видно и на видео и у меня в докер логах после создания пары десятков отношений.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 2 ай бұрын
Вполне возможно
@JohnKannedy
@JohnKannedy Жыл бұрын
Благодарю за урок
@axeaxe1819
@axeaxe1819 Жыл бұрын
Спасибо за ваш труд!
@ВиталийКоновалов-г1ц
@ВиталийКоновалов-г1ц Жыл бұрын
Огромное спасибо за видео, я лишь хотел сказать , что с апи запросами можно работать тулбаром с django-debug-toolbar-force
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
А для celery тасков будет работать?
@ВиталийКоновалов-г1ц
@ВиталийКоновалов-г1ц Жыл бұрын
@@SeniorPomidorDeveloper я не пробовал) только учусь, Celery только вчера начал пробовать
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Ага. Ну toolbar наверно подразумевает, что он подключен к чему-то. Это же «менюшка». А логирование, в этом смысле больше универсальная штука .
@ВиталийКоновалов-г1ц
@ВиталийКоновалов-г1ц Жыл бұрын
@@SeniorPomidorDeveloper Спасибо! и еще раз огромное спасибо за курс!
@dodokwak
@dodokwak Жыл бұрын
Это прекрасно.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Знакомые лица! )
@begula_chan
@begula_chan Жыл бұрын
Здравствуйте, благодарю за прекрасный курс! Хотел у вас спросить, зачем мы используем prefetch_related, если у модели Subscription только FK связи? Ведь prefetch_related используется только для M2M связей...
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Спасибо. Prefetch related используется для m2m , а также для FK связей , при обращении с другой стороны связи
@begula_chan
@begula_chan Жыл бұрын
@@SeniorPomidorDeveloper благодарю за ответ! Кстати, вы планируете делать новые курсы? У вас к этому делу настоящий талант, я уже все ваши курсы пересмотрел и столько узнал, сколько за 2 месяца обучения не видывал.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Возможно кое-что ближайшее время сделаю. Но таких больших курсов пока не планирую .
@begula_chan
@begula_chan Жыл бұрын
@@SeniorPomidorDeveloper буду с радостью ждать. Извините за мою наглость, но может вы посоветуете в двух словах как двигаться дальше и что вообще изучать?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
@@begula_chan Делайте свой проект и применяйте там полученные знания. Другого способа нет. Ну или сразу работу найти, если получится
@ИсраилБ
@ИсраилБ Жыл бұрын
Болею, но смотрю)))
@jamjam3337
@jamjam3337 9 ай бұрын
спасибо!😎
@BorisenkoV89
@BorisenkoV89 Жыл бұрын
Привет, спасибо за видео. Было бы классно устраивать раз в неделю прямую трансляцию и поотвечать на вопросы по пройденным темам, что думаешь?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Немного влом) Но посмотрим, может по окончанию курса что-то такое сделаю.
@abduraxmon9804
@abduraxmon9804 Жыл бұрын
классное видео, можно использовать "select_related()" вместе "prefetch_related()" они оба работают одинаково?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Работают по разному , но совмещать можно
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
github.com/chepe4pi/service_app
@ДанилКропива
@ДанилКропива Жыл бұрын
Когда у модели много полей с внешним ключом (ForeignKey), лучше использовать метод prefetch_related.
@cristianglodeanu2329
@cristianglodeanu2329 Жыл бұрын
я так понимаю тут минимум 3 запроса будет всегда , 1 запрос для таблицы Subscription ('id','plan) 2 запрос для таблицы Client('client_name','email') а 3 запрос для Plan ("plan") , где мы прогнали его через отедльный сериализатор , и вот все эти префетч селектед , релейтед это чтобы не брать ненужные поля ? получая оптимизацию ? , сложно представить эту абстракцию , как все происходит ):
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Нет, prefetch и select related именно чтобы запросы экономить. А точнее чтобы избавится от проблемы n+1 . Ненужные поля убираем через only. Конечно, какой-то минимум запросов всегда будет.
@DenisDemyanov-o4r
@DenisDemyanov-o4r Жыл бұрын
Grazie Senior
@gvadellupa9335
@gvadellupa9335 Жыл бұрын
Что скажешь про objects.values()? Кажется, здесь можно было кратенько через этот метод написать
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Можно все что угодно.
@nikitakurabtsev1222
@nikitakurabtsev1222 Жыл бұрын
если .prefetch_related('plan') заменить на .select_related('plan') вместо 3 запросов будет 2, потому что будет джоин Subscription вместе с Plan таблицей.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Насколько мне известно, prefetch related и select related, сделаны для разных видов связей . Я проект уже удалил , но может кто-то из подписчиков перепроверит, интересно найти самый оптимальный вариант
@dmytrokovalov2199
@dmytrokovalov2199 Жыл бұрын
select_related для O2O, FK, а prefetch_related для M2M
@user-fo8yv6cf9h
@user-fo8yv6cf9h 7 ай бұрын
thanks
@zhivokost36
@zhivokost36 Жыл бұрын
А как в данном примере через ORM сделать один SQL-запрос? На SQL можно через JOIN'ы сделать, а вот через ORM не понимаю как это возможно. P.S. отличная тема для обсуждения, оптимизация наше всё.
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Через raw() это делается . А join’ы нам автоматически формирует select_related и prefetch
@karasik5695
@karasik5695 Жыл бұрын
Привет! Спасибо еще раз за видео. Немножко нагло с моей стороны, но все же попробую: а ты не можешь выкладывать по несколько видео в день, очень хочется закончить курс за новогодние праздники.Спасибо большое!
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Я их параллельно доделываю, наверное не успею по два в день делать.
@karasik5695
@karasik5695 Жыл бұрын
@@SeniorPomidorDeveloper все равно спасибо, прекрасный курс
@UlanbekKubanychbekov
@UlanbekKubanychbekov 11 ай бұрын
Здравствуйте, Помидор! Можно узнать какой у вас MAC и какие у него характеристики?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 11 ай бұрын
Добрый день! Это MacBook Air M1 16Gb RAM 256SDD. Для работы на крупном проекте python/django хватает. Для большего комфорта взял бы больше SSD , но вцелом мне хватает , если сочетать с iCloud.
@npc-r390
@npc-r390 Жыл бұрын
Сейчас у тебя все-равно на endpoint делается 3 запроса: subsctiptions, plans и client. Можно ли и как объединить это в одну цепочку джойнов?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Есть идеи? )
@SeliverstovMusic
@SeliverstovMusic Жыл бұрын
А как уменьшить количество запросов, когда мы в коде итерируемся по queryset и обращаемся отдельно к каждому элементу? select_related или prefetch_related (честно говоря, не понял разницу)?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Один для связи one to one, другой для связи one to many
@alexdzehil7194
@alexdzehil7194 Жыл бұрын
Типа делать одним запросом с prefetch_related или select_related выборку всего что тебе нужно, а потом уже в цикле работать с данными, чтобы при каждой итерации в базу не лазить. Как раз такая задача на неделе была, целый день запрос писал.
@ibrahimoglu
@ibrahimoglu Жыл бұрын
👍
@russul2700
@russul2700 Жыл бұрын
Спасибо за отличное видео! При добавлении Logging в сеттингах выходит ошибка: ValueError: Unable to configure handler 'console' ModuleNotFoundError: No module named 'Logging' как можно исправить скажи пожалуйста ?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Может с маленькой буквы надо написать ? Можно сверить с кодом тут github.com/chepe4pi/service_app/blob/day-3-1/service/service/settings.py
@ClinKZKZKZ
@ClinKZKZKZ Жыл бұрын
Я как понимаю в джанго нет подзапросов как raw sql или sqlalchemy чтобы за один запрос вывести все данные?
@MrArtlex
@MrArtlex Жыл бұрын
есть. Subquery называется
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Ага. И raw sql тоже можно делать
@Chel1k7
@Chel1k7 Жыл бұрын
sql алхимия топ, там если не указать доп связь она просто не выдаст тебе данные из другой модели и не создаст кучу запросов
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Не очень удобно для разработки. Но наверное это скорее плюс , чем минус, что надо постоянно о связях думать
@Chel1k7
@Chel1k7 Жыл бұрын
@@SeniorPomidorDeveloper А Вы лично работали с алхимией? не планируете ли сделать в будущем курс по Fastapi?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Немного работал. Возможно сделаю, пока особенно времени нет (
@ИльяСевостьянов-э5т
@ИльяСевостьянов-э5т 7 ай бұрын
Спасибо, все круто, но как настроить вывод в pycharm console?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 7 ай бұрын
Если PyCharm professional там вроде по умолчанию это работает
@ИльяСевостьянов-э5т
@ИльяСевостьянов-э5т 7 ай бұрын
@@SeniorPomidorDeveloper а еже ли я из простого народа, просто сталкивался раньше с этим, не могу никак найти решения в тыртырнете, мистор сеньер помидор. абалденный ник
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper 7 ай бұрын
Спасибо 😁 Не очень понял что имеется ввиду. Если консоль Джанго то это только а Pro версии. Если терминал ОС то он вроде в любой версии и настраивать его не надо
@ИльяСевостьянов-э5т
@ИльяСевостьянов-э5т 7 ай бұрын
​@@SeniorPomidorDeveloper Проблема была не в том что я запускал из pycharma, а неизвестно где, ибо я только что запустил из консоли и там тоже ничего не выводиться.
@ИльяСевостьянов-э5т
@ИльяСевостьянов-э5т 7 ай бұрын
@@SeniorPomidorDeveloper ладно, как обычно ахах, было django.db.backend а не django.db.backends
@andreykuskov8807
@andreykuskov8807 Жыл бұрын
А можно ссылку на гитхаб?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
github.com/chepe4pi/service_app
@sergeyly5438
@sergeyly5438 Жыл бұрын
Очень крутой курс, жаль только используется в не полноценный пайчарм, а обрубок в виде комьюнити эдишн
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Согласен. Сам об этом жалею , у меня много лет Pro. Проблема что использовать в курсе платный инструмент - это не очень правильно, 99% зрителей не будут его ради курса покупать . Тем более что JetBrains мне пока ничего за рекламу не платит )
@sergeyly5438
@sergeyly5438 Жыл бұрын
@@SeniorPomidorDeveloper если на макбук денег хватает, то и на стоящий инструмент в виде програмного обеспечения можно накопить. А брейнсы только англоязычных блогеров подкармливают судя по роликам
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
У меня на макбук хватает, но наверно не у всех. Тем более сейчас проблемно купить с российской карты.
@sergeyly5438
@sergeyly5438 Жыл бұрын
@@SeniorPomidorDeveloper купить можно через биток потратив 20 минут, чтобы разобраться при желании. К тому же торенты работают исправно или на крайняк абуз пробника от брейнсов
@Bibliophilos
@Bibliophilos Жыл бұрын
На Степике за прохождение заданий дают промокоды на полгода профи эдишн.
@pretcb
@pretcb Жыл бұрын
+
@NikolayN707
@NikolayN707 Жыл бұрын
расскажите пожалуйста как желать дамп базы и засеивать подготовленными данными чистую бд. когда делаю волюм с бд и потом примонтировав его в другом месте - база крашится (./data:/var/lib/postgresql/data/)
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Спросите в группе в телеграмме, ссылка в профиле
@artemunix5223
@artemunix5223 Жыл бұрын
покажешь как с апи twitter facebook tiktok telegram google работать?
@SeniorPomidorDeveloper
@SeniorPomidorDeveloper Жыл бұрын
Нет
When u fight over the armrest
00:41
Adam W
Рет қаралды 32 МЛН
Симбу закрыли дома?! 🔒 #симба #симбочка #арти
00:41
Симбочка Пимпочка
Рет қаралды 4,9 МЛН
Оптимизация Django. 5 - Celery + Docker
30:31
Senior Pomidor Developer
Рет қаралды 16 М.
Сравниваем: RAG на Local LLM vs GPT-4
5:19
AI Experience Exchange
Рет қаралды 8 М.
Django REST Framework - создаем API для сайта
21:17
Дед погроммист
Рет қаралды 19 М.
НАЧАЛО ОПТИМИЗАЦИИ DJANGO ORM | Python 3, Питон 3
23:47
Андрей Иванов | Python
Рет қаралды 3,7 М.
When u fight over the armrest
00:41
Adam W
Рет қаралды 32 МЛН