Спасибо, за урок. Такой код сделает только один запрос в бд в приведенном в видео случае с нужными полями queryset = Subscription.objects.all().select_related('plan', 'client', 'client__user').only( 'client__user__email', 'client__company_name', 'plan_id', )
Привет, урок полезный, очень понравился. Хотелось бы еще более подробный разбор разницы между select_related и prefetch_related - когда и что использовать на разных примерах. Спасибо!
Привет! Да тут особо нечего рассказывать. Select related если связываем с одним объектом, как это в Foreign Key, а если на той стороне много объектов и связь Many to Many значит prefetch related .
Спасибо за очень хороший урок, попробовал сам на линуксе запустить через 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 , Я имел ввиду что конкретно моя попытка оптимизации была бы лучше представленной у вас, так-то оптимизацию видно и на видео и у меня в докер логах после создания пары десятков отношений.
Спасибо вам. Есть одно видео про юнит тесты. В синем курсе. Но там достаточно базовая информация. Про тестировании логики сложно рассказать без реального приложения
Здравствуйте, благодарю за прекрасный курс! Хотел у вас спросить, зачем мы используем prefetch_related, если у модели Subscription только FK связи? Ведь prefetch_related используется только для M2M связей...
@@SeniorPomidorDeveloper благодарю за ответ! Кстати, вы планируете делать новые курсы? У вас к этому делу настоящий талант, я уже все ваши курсы пересмотрел и столько узнал, сколько за 2 месяца обучения не видывал.
@@SeniorPomidorDeveloper буду с радостью ждать. Извините за мою наглость, но может вы посоветуете в двух словах как двигаться дальше и что вообще изучать?
Добрый день! Это MacBook Air M1 16Gb RAM 256SDD. Для работы на крупном проекте python/django хватает. Для большего комфорта взял бы больше SSD , но вцелом мне хватает , если сочетать с iCloud.
А как уменьшить количество запросов, когда мы в коде итерируемся по queryset и обращаемся отдельно к каждому элементу? select_related или prefetch_related (честно говоря, не понял разницу)?
Типа делать одним запросом с prefetch_related или select_related выборку всего что тебе нужно, а потом уже в цикле работать с данными, чтобы при каждой итерации в базу не лазить. Как раз такая задача на неделе была, целый день запрос писал.
если .prefetch_related('plan') заменить на .select_related('plan') вместо 3 запросов будет 2, потому что будет джоин Subscription вместе с Plan таблицей.
Насколько мне известно, prefetch related и select related, сделаны для разных видов связей . Я проект уже удалил , но может кто-то из подписчиков перепроверит, интересно найти самый оптимальный вариант
я так понимаю тут минимум 3 запроса будет всегда , 1 запрос для таблицы Subscription ('id','plan) 2 запрос для таблицы Client('client_name','email') а 3 запрос для Plan ("plan") , где мы прогнали его через отедльный сериализатор , и вот все эти префетч селектед , релейтед это чтобы не брать ненужные поля ? получая оптимизацию ? , сложно представить эту абстракцию , как все происходит ):
Нет, prefetch и select related именно чтобы запросы экономить. А точнее чтобы избавится от проблемы n+1 . Ненужные поля убираем через only. Конечно, какой-то минимум запросов всегда будет.
А как в данном примере через ORM сделать один SQL-запрос? На SQL можно через JOIN'ы сделать, а вот через ORM не понимаю как это возможно. P.S. отличная тема для обсуждения, оптимизация наше всё.
Спасибо за отличное видео! При добавлении Logging в сеттингах выходит ошибка: ValueError: Unable to configure handler 'console' ModuleNotFoundError: No module named 'Logging' как можно исправить скажи пожалуйста ?
Привет! Спасибо еще раз за видео. Немножко нагло с моей стороны, но все же попробую: а ты не можешь выкладывать по несколько видео в день, очень хочется закончить курс за новогодние праздники.Спасибо большое!
@@SeniorPomidorDeveloper а еже ли я из простого народа, просто сталкивался раньше с этим, не могу никак найти решения в тыртырнете, мистор сеньер помидор. абалденный ник
Спасибо 😁 Не очень понял что имеется ввиду. Если консоль Джанго то это только а Pro версии. Если терминал ОС то он вроде в любой версии и настраивать его не надо
@@SeniorPomidorDeveloper Проблема была не в том что я запускал из pycharma, а неизвестно где, ибо я только что запустил из консоли и там тоже ничего не выводиться.
Согласен. Сам об этом жалею , у меня много лет Pro. Проблема что использовать в курсе платный инструмент - это не очень правильно, 99% зрителей не будут его ради курса покупать . Тем более что JetBrains мне пока ничего за рекламу не платит )
@@SeniorPomidorDeveloper если на макбук денег хватает, то и на стоящий инструмент в виде програмного обеспечения можно накопить. А брейнсы только англоязычных блогеров подкармливают судя по роликам
@@SeniorPomidorDeveloper купить можно через биток потратив 20 минут, чтобы разобраться при желании. К тому же торенты работают исправно или на крайняк абуз пробника от брейнсов
расскажите пожалуйста как желать дамп базы и засеивать подготовленными данными чистую бд. когда делаю волюм с бд и потом примонтировав его в другом месте - база крашится (./data:/var/lib/postgresql/data/)
Спасибо, за урок.
Такой код сделает только один запрос в бд в приведенном в видео случае с нужными полями
queryset = Subscription.objects.all().select_related('plan', 'client', 'client__user').only(
'client__user__email',
'client__company_name',
'plan_id',
)
Прикольно, что внутри Prefetch можно сделать select_related, это полезно
Выходные здорового человека - курс от Алексея :)
вы серьезна? здорового? самого-самого нормального здорового человека? потратить выходные на этот курс...
А вы чем в выходные занимаетесь?
Большое спасибо за урок! Благодаря ему в моем пет проекте теперь нет проблемы n+1, а кол-во запросов снизилось с 20+ до 6
Супер! Рад что помогло
Про prefetch_related знал, но про сам класс Prefetch и отдельную выборку полей круто)
Огромное количество полезнейшей инфы понятнейшим языком. Просто топ.
Отличное видео. Шаг за шагом всё работает при повторении на собственном компьютере.
Благодарность автору.
Привет, урок полезный, очень понравился. Хотелось бы еще более подробный разбор разницы между select_related и prefetch_related - когда и что использовать на разных примерах. Спасибо!
Привет!
Да тут особо нечего рассказывать.
Select related если связываем с одним объектом, как это в Foreign Key, а если на той стороне много объектов и связь Many to Many значит prefetch related .
@@SeniorPomidorDeveloper спасибо!
Наглядно и понятно, спасибо!
Спасибо за озвучку интересных тем
100% нужная тема, с ростом количества записей в бд рано или поздно это придется делать.
Ага. Особенно когда одним prefetch можно вместо 500 запросов сделать 1.
Спасибо за очень хороший урок, попробовал сам на линуксе запустить через 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 хотелось бы именно полноценнный курс. Может быть, когда будет время, сделаете ☺️
Очень крутой и полезный видос
Благодарю за урок
Спасибо за ваш труд!
Здравствуйте, благодарю за прекрасный курс!
Хотел у вас спросить, зачем мы используем prefetch_related, если у модели Subscription только FK связи? Ведь prefetch_related используется только для M2M связей...
Спасибо. Prefetch related используется для m2m , а также для FK связей , при обращении с другой стороны связи
@@SeniorPomidorDeveloper благодарю за ответ! Кстати, вы планируете делать новые курсы? У вас к этому делу настоящий талант, я уже все ваши курсы пересмотрел и столько узнал, сколько за 2 месяца обучения не видывал.
Возможно кое-что ближайшее время сделаю. Но таких больших курсов пока не планирую .
@@SeniorPomidorDeveloper буду с радостью ждать. Извините за мою наглость, но может вы посоветуете в двух словах как двигаться дальше и что вообще изучать?
@@begula_chan Делайте свой проект и применяйте там полученные знания. Другого способа нет. Ну или сразу работу найти, если получится
Огромное спасибо за видео, я лишь хотел сказать , что с апи запросами можно работать тулбаром с django-debug-toolbar-force
А для celery тасков будет работать?
@@SeniorPomidorDeveloper я не пробовал) только учусь, Celery только вчера начал пробовать
Ага. Ну toolbar наверно подразумевает, что он подключен к чему-то. Это же «менюшка». А логирование, в этом смысле больше универсальная штука .
@@SeniorPomidorDeveloper Спасибо! и еще раз огромное спасибо за курс!
Здравствуйте, Помидор!
Можно узнать какой у вас MAC и какие у него характеристики?
Добрый день!
Это MacBook Air M1 16Gb RAM 256SDD. Для работы на крупном проекте python/django хватает.
Для большего комфорта взял бы больше SSD , но вцелом мне хватает , если сочетать с iCloud.
Grazie Senior
А как уменьшить количество запросов, когда мы в коде итерируемся по queryset и обращаемся отдельно к каждому элементу? select_related или prefetch_related (честно говоря, не понял разницу)?
Один для связи one to one, другой для связи one to many
Типа делать одним запросом с prefetch_related или select_related выборку всего что тебе нужно, а потом уже в цикле работать с данными, чтобы при каждой итерации в базу не лазить. Как раз такая задача на неделе была, целый день запрос писал.
thanks
Это прекрасно.
Знакомые лица! )
Что скажешь про objects.values()? Кажется, здесь можно было кратенько через этот метод написать
Можно все что угодно.
спасибо!😎
классное видео, можно использовать "select_related()"
вместе "prefetch_related()" они оба работают одинаково?
Работают по разному , но совмещать можно
github.com/chepe4pi/service_app
Когда у модели много полей с внешним ключом (ForeignKey), лучше использовать метод prefetch_related.
Сейчас у тебя все-равно на endpoint делается 3 запроса: subsctiptions, plans и client.
Можно ли и как объединить это в одну цепочку джойнов?
Есть идеи? )
Болею, но смотрю)))
если .prefetch_related('plan') заменить на .select_related('plan') вместо 3 запросов будет 2, потому что будет джоин Subscription вместе с Plan таблицей.
Насколько мне известно, prefetch related и select related, сделаны для разных видов связей .
Я проект уже удалил , но может кто-то из подписчиков перепроверит, интересно найти самый оптимальный вариант
select_related для O2O, FK, а prefetch_related для M2M
я так понимаю тут минимум 3 запроса будет всегда , 1 запрос для таблицы Subscription ('id','plan) 2 запрос для таблицы Client('client_name','email') а 3 запрос для Plan ("plan") , где мы прогнали его через отедльный сериализатор , и вот все эти префетч селектед , релейтед это чтобы не брать ненужные поля ? получая оптимизацию ? , сложно представить эту абстракцию , как все происходит ):
Нет, prefetch и select related именно чтобы запросы экономить. А точнее чтобы избавится от проблемы n+1 . Ненужные поля убираем через only.
Конечно, какой-то минимум запросов всегда будет.
👍
А как в данном примере через ORM сделать один SQL-запрос? На SQL можно через JOIN'ы сделать, а вот через ORM не понимаю как это возможно.
P.S. отличная тема для обсуждения, оптимизация наше всё.
Через raw() это делается .
А join’ы нам автоматически формирует select_related и prefetch
Я как понимаю в джанго нет подзапросов как raw sql или sqlalchemy чтобы за один запрос вывести все данные?
есть. Subquery называется
Ага. И raw sql тоже можно делать
Привет, спасибо за видео. Было бы классно устраивать раз в неделю прямую трансляцию и поотвечать на вопросы по пройденным темам, что думаешь?
Немного влом) Но посмотрим, может по окончанию курса что-то такое сделаю.
Спасибо за отличное видео!
При добавлении Logging в сеттингах выходит ошибка:
ValueError: Unable to configure handler 'console'
ModuleNotFoundError: No module named 'Logging'
как можно исправить скажи пожалуйста ?
Может с маленькой буквы надо написать ?
Можно сверить с кодом тут github.com/chepe4pi/service_app/blob/day-3-1/service/service/settings.py
sql алхимия топ, там если не указать доп связь она просто не выдаст тебе данные из другой модели и не создаст кучу запросов
Не очень удобно для разработки. Но наверное это скорее плюс , чем минус, что надо постоянно о связях думать
@@SeniorPomidorDeveloper А Вы лично работали с алхимией? не планируете ли сделать в будущем курс по Fastapi?
Немного работал. Возможно сделаю, пока особенно времени нет (
Привет! Спасибо еще раз за видео. Немножко нагло с моей стороны, но все же попробую: а ты не можешь выкладывать по несколько видео в день, очень хочется закончить курс за новогодние праздники.Спасибо большое!
Я их параллельно доделываю, наверное не успею по два в день делать.
@@SeniorPomidorDeveloper все равно спасибо, прекрасный курс
Спасибо, все круто, но как настроить вывод в pycharm console?
Если PyCharm professional там вроде по умолчанию это работает
@@SeniorPomidorDeveloper а еже ли я из простого народа, просто сталкивался раньше с этим, не могу никак найти решения в тыртырнете, мистор сеньер помидор. абалденный ник
Спасибо 😁
Не очень понял что имеется ввиду. Если консоль Джанго то это только а Pro версии. Если терминал ОС то он вроде в любой версии и настраивать его не надо
@@SeniorPomidorDeveloper Проблема была не в том что я запускал из pycharma, а неизвестно где, ибо я только что запустил из консоли и там тоже ничего не выводиться.
@@SeniorPomidorDeveloper ладно, как обычно ахах, было django.db.backend а не django.db.backends
Очень крутой курс, жаль только используется в не полноценный пайчарм, а обрубок в виде комьюнити эдишн
Согласен. Сам об этом жалею , у меня много лет Pro. Проблема что использовать в курсе платный инструмент - это не очень правильно, 99% зрителей не будут его ради курса покупать . Тем более что JetBrains мне пока ничего за рекламу не платит )
@@SeniorPomidorDeveloper если на макбук денег хватает, то и на стоящий инструмент в виде програмного обеспечения можно накопить. А брейнсы только англоязычных блогеров подкармливают судя по роликам
У меня на макбук хватает, но наверно не у всех. Тем более сейчас проблемно купить с российской карты.
@@SeniorPomidorDeveloper купить можно через биток потратив 20 минут, чтобы разобраться при желании. К тому же торенты работают исправно или на крайняк абуз пробника от брейнсов
На Степике за прохождение заданий дают промокоды на полгода профи эдишн.
А можно ссылку на гитхаб?
github.com/chepe4pi/service_app
+
расскажите пожалуйста как желать дамп базы и засеивать подготовленными данными чистую бд. когда делаю волюм с бд и потом примонтировав его в другом месте - база крашится (./data:/var/lib/postgresql/data/)
Спросите в группе в телеграмме, ссылка в профиле
покажешь как с апи twitter facebook tiktok telegram google работать?
Нет