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

Поделиться
HTML-код
  • Опубликовано: 30 ноя 2024

Комментарии • 105

  • @nikez600
    @nikez600 Год назад +7

    Спасибо, за урок.
    Такой код сделает только один запрос в бд в приведенном в видео случае с нужными полями
    queryset = Subscription.objects.all().select_related('plan', 'client', 'client__user').only(
    'client__user__email',
    'client__company_name',
    'plan_id',
    )

  • @koloboopsik
    @koloboopsik Год назад +9

    Прикольно, что внутри Prefetch можно сделать select_related, это полезно

  • @Bibliophilos
    @Bibliophilos Год назад +10

    Выходные здорового человека - курс от Алексея :)

    • @Igor160594
      @Igor160594 Год назад

      вы серьезна? здорового? самого-самого нормального здорового человека? потратить выходные на этот курс...

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      А вы чем в выходные занимаетесь?

  • @bernardsoul8936
    @bernardsoul8936 6 месяцев назад +1

    Большое спасибо за урок! Благодаря ему в моем пет проекте теперь нет проблемы n+1, а кол-во запросов снизилось с 20+ до 6

  • @ВладКалина-у5ь
    @ВладКалина-у5ь Год назад +4

    Про prefetch_related знал, но про сам класс Prefetch и отдельную выборку полей круто)

  • @Alekseyild
    @Alekseyild Год назад +2

    Огромное количество полезнейшей инфы понятнейшим языком. Просто топ.

  • @Pavel-er4hy
    @Pavel-er4hy Год назад +1

    Отличное видео. Шаг за шагом всё работает при повторении на собственном компьютере.
    Благодарность автору.

  • @davidsaidov8308
    @davidsaidov8308 2 месяца назад

    Привет, урок полезный, очень понравился. Хотелось бы еще более подробный разбор разницы между select_related и prefetch_related - когда и что использовать на разных примерах. Спасибо!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 месяца назад +1

      Привет!
      Да тут особо нечего рассказывать.
      Select related если связываем с одним объектом, как это в Foreign Key, а если на той стороне много объектов и связь Many to Many значит prefetch related .

    • @davidsaidov8308
      @davidsaidov8308 2 месяца назад

      @@SeniorPomidorDeveloper спасибо!

  • @nvkey
    @nvkey 8 месяцев назад +1

    Наглядно и понятно, спасибо!

  • @unaibekovbakhyt6517
    @unaibekovbakhyt6517 Год назад +1

    Спасибо за озвучку интересных тем

  • @alexdzehil7194
    @alexdzehil7194 Год назад +1

    100% нужная тема, с ростом количества записей в бд рано или поздно это придется делать.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Ага. Особенно когда одним prefetch можно вместо 500 запросов сделать 1.

  • @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 месяца назад +1

      Спасибо за просмотр и комментарий!
      Тут конечно не будет видно оптимизации, пока мы тестируем на не нагруженном приложении практически без данных . А на реальных проектах будет видно сразу. А на нагруженных еще и деньги на мощности нам сэкономит.

    • @kleancloan3536
      @kleancloan3536 2 месяца назад

      @@SeniorPomidorDeveloper , Я имел ввиду что конкретно моя попытка оптимизации была бы лучше представленной у вас, так-то оптимизацию видно и на видео и у меня в докер логах после создания пары десятков отношений.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 месяца назад

      Вполне возможно

  • @Developer_python_
    @Developer_python_ 8 месяцев назад

    Тимлиду подкинулы твой курс- теперь пересматриваю опять чтобы внедрить в проект) Спасибо!

  • @АлексейКомаров-ф8к

    Спасибо большое. Очень доступно. Я бы с удовольствием глянул видео про тестирование проектов на Джанго

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Спасибо вам. Есть одно видео про юнит тесты. В синем курсе. Но там достаточно базовая информация. Про тестировании логики сложно рассказать без реального приложения

    • @АлексейКомаров-ф8к
      @АлексейКомаров-ф8к Год назад

      @@SeniorPomidorDeveloper хотелось бы именно полноценнный курс. Может быть, когда будет время, сделаете ☺️

  • @airguy5964
    @airguy5964 Год назад +1

    Очень крутой и полезный видос

  • @JohnKannedy
    @JohnKannedy Год назад

    Благодарю за урок

  • @axeaxe1819
    @axeaxe1819 Год назад

    Спасибо за ваш труд!

  • @begula_chan
    @begula_chan Год назад

    Здравствуйте, благодарю за прекрасный курс!
    Хотел у вас спросить, зачем мы используем prefetch_related, если у модели Subscription только FK связи? Ведь prefetch_related используется только для M2M связей...

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Спасибо. Prefetch related используется для m2m , а также для FK связей , при обращении с другой стороны связи

    • @begula_chan
      @begula_chan Год назад

      @@SeniorPomidorDeveloper благодарю за ответ! Кстати, вы планируете делать новые курсы? У вас к этому делу настоящий талант, я уже все ваши курсы пересмотрел и столько узнал, сколько за 2 месяца обучения не видывал.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Возможно кое-что ближайшее время сделаю. Но таких больших курсов пока не планирую .

    • @begula_chan
      @begula_chan Год назад

      @@SeniorPomidorDeveloper буду с радостью ждать. Извините за мою наглость, но может вы посоветуете в двух словах как двигаться дальше и что вообще изучать?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      @@begula_chan Делайте свой проект и применяйте там полученные знания. Другого способа нет. Ну или сразу работу найти, если получится

  • @ВиталийКоновалов-г1ц

    Огромное спасибо за видео, я лишь хотел сказать , что с апи запросами можно работать тулбаром с django-debug-toolbar-force

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      А для celery тасков будет работать?

    • @ВиталийКоновалов-г1ц
      @ВиталийКоновалов-г1ц Год назад

      @@SeniorPomidorDeveloper я не пробовал) только учусь, Celery только вчера начал пробовать

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Ага. Ну toolbar наверно подразумевает, что он подключен к чему-то. Это же «менюшка». А логирование, в этом смысле больше универсальная штука .

    • @ВиталийКоновалов-г1ц
      @ВиталийКоновалов-г1ц Год назад

      @@SeniorPomidorDeveloper Спасибо! и еще раз огромное спасибо за курс!

  • @UlanbekKubanychbekov
    @UlanbekKubanychbekov 11 месяцев назад

    Здравствуйте, Помидор!
    Можно узнать какой у вас MAC и какие у него характеристики?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  11 месяцев назад

      Добрый день!
      Это MacBook Air M1 16Gb RAM 256SDD. Для работы на крупном проекте python/django хватает.
      Для большего комфорта взял бы больше SSD , но вцелом мне хватает , если сочетать с iCloud.

  • @DenisDemyanov-o4r
    @DenisDemyanov-o4r Год назад

    Grazie Senior

  • @SeliverstovMusic
    @SeliverstovMusic Год назад

    А как уменьшить количество запросов, когда мы в коде итерируемся по queryset и обращаемся отдельно к каждому элементу? select_related или prefetch_related (честно говоря, не понял разницу)?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Один для связи one to one, другой для связи one to many

    • @alexdzehil7194
      @alexdzehil7194 Год назад

      Типа делать одним запросом с prefetch_related или select_related выборку всего что тебе нужно, а потом уже в цикле работать с данными, чтобы при каждой итерации в базу не лазить. Как раз такая задача на неделе была, целый день запрос писал.

  • @user-fo8yv6cf9h
    @user-fo8yv6cf9h 7 месяцев назад

    thanks

  • @dodokwak
    @dodokwak Год назад

    Это прекрасно.

  • @gvadellupa9335
    @gvadellupa9335 Год назад

    Что скажешь про objects.values()? Кажется, здесь можно было кратенько через этот метод написать

  • @jamjam3337
    @jamjam3337 9 месяцев назад

    спасибо!😎

  • @abduraxmon9804
    @abduraxmon9804 Год назад

    классное видео, можно использовать "select_related()"
    вместе "prefetch_related()" они оба работают одинаково?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Работают по разному , но совмещать можно

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      github.com/chepe4pi/service_app

    • @ДанилКропива
      @ДанилКропива Год назад

      Когда у модели много полей с внешним ключом (ForeignKey), лучше использовать метод prefetch_related.

  • @npc-r390
    @npc-r390 Год назад

    Сейчас у тебя все-равно на endpoint делается 3 запроса: subsctiptions, plans и client.
    Можно ли и как объединить это в одну цепочку джойнов?

  • @ИсраилБ
    @ИсраилБ Год назад

    Болею, но смотрю)))

  • @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

  • @cristianglodeanu2329
    @cristianglodeanu2329 Год назад

    я так понимаю тут минимум 3 запроса будет всегда , 1 запрос для таблицы Subscription ('id','plan) 2 запрос для таблицы Client('client_name','email') а 3 запрос для Plan ("plan") , где мы прогнали его через отедльный сериализатор , и вот все эти префетч селектед , релейтед это чтобы не брать ненужные поля ? получая оптимизацию ? , сложно представить эту абстракцию , как все происходит ):

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Нет, prefetch и select related именно чтобы запросы экономить. А точнее чтобы избавится от проблемы n+1 . Ненужные поля убираем через only.
      Конечно, какой-то минимум запросов всегда будет.

  • @ibrahimoglu
    @ibrahimoglu Год назад

    👍

  • @zhivokost36
    @zhivokost36 Год назад

    А как в данном примере через ORM сделать один SQL-запрос? На SQL можно через JOIN'ы сделать, а вот через ORM не понимаю как это возможно.
    P.S. отличная тема для обсуждения, оптимизация наше всё.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Через raw() это делается .
      А join’ы нам автоматически формирует select_related и prefetch

  • @ClinKZKZKZ
    @ClinKZKZKZ Год назад

    Я как понимаю в джанго нет подзапросов как raw sql или sqlalchemy чтобы за один запрос вывести все данные?

  • @BorisenkoV89
    @BorisenkoV89 Год назад

    Привет, спасибо за видео. Было бы классно устраивать раз в неделю прямую трансляцию и поотвечать на вопросы по пройденным темам, что думаешь?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Немного влом) Но посмотрим, может по окончанию курса что-то такое сделаю.

  • @russul2700
    @russul2700 Год назад

    Спасибо за отличное видео!
    При добавлении Logging в сеттингах выходит ошибка:
    ValueError: Unable to configure handler 'console'
    ModuleNotFoundError: No module named 'Logging'
    как можно исправить скажи пожалуйста ?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +1

      Может с маленькой буквы надо написать ?
      Можно сверить с кодом тут github.com/chepe4pi/service_app/blob/day-3-1/service/service/settings.py

  • @Chel1k7
    @Chel1k7 Год назад

    sql алхимия топ, там если не указать доп связь она просто не выдаст тебе данные из другой модели и не создаст кучу запросов

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Не очень удобно для разработки. Но наверное это скорее плюс , чем минус, что надо постоянно о связях думать

    • @Chel1k7
      @Chel1k7 Год назад

      @@SeniorPomidorDeveloper А Вы лично работали с алхимией? не планируете ли сделать в будущем курс по Fastapi?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Немного работал. Возможно сделаю, пока особенно времени нет (

  • @karasik5695
    @karasik5695 Год назад

    Привет! Спасибо еще раз за видео. Немножко нагло с моей стороны, но все же попробую: а ты не можешь выкладывать по несколько видео в день, очень хочется закончить курс за новогодние праздники.Спасибо большое!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Я их параллельно доделываю, наверное не успею по два в день делать.

    • @karasik5695
      @karasik5695 Год назад

      @@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

  • @sergeyly5438
    @sergeyly5438 Год назад

    Очень крутой курс, жаль только используется в не полноценный пайчарм, а обрубок в виде комьюнити эдишн

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад +2

      Согласен. Сам об этом жалею , у меня много лет Pro. Проблема что использовать в курсе платный инструмент - это не очень правильно, 99% зрителей не будут его ради курса покупать . Тем более что JetBrains мне пока ничего за рекламу не платит )

    • @sergeyly5438
      @sergeyly5438 Год назад

      @@SeniorPomidorDeveloper если на макбук денег хватает, то и на стоящий инструмент в виде програмного обеспечения можно накопить. А брейнсы только англоязычных блогеров подкармливают судя по роликам

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      У меня на макбук хватает, но наверно не у всех. Тем более сейчас проблемно купить с российской карты.

    • @sergeyly5438
      @sergeyly5438 Год назад

      @@SeniorPomidorDeveloper купить можно через биток потратив 20 минут, чтобы разобраться при желании. К тому же торенты работают исправно или на крайняк абуз пробника от брейнсов

    • @Bibliophilos
      @Bibliophilos Год назад

      На Степике за прохождение заданий дают промокоды на полгода профи эдишн.

  • @andreykuskov8807
    @andreykuskov8807 Год назад

    А можно ссылку на гитхаб?

  • @pretcb
    @pretcb Год назад

    +

  • @NikolayN707
    @NikolayN707 Год назад

    расскажите пожалуйста как желать дамп базы и засеивать подготовленными данными чистую бд. когда делаю волюм с бд и потом примонтировав его в другом месте - база крашится (./data:/var/lib/postgresql/data/)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Год назад

      Спросите в группе в телеграмме, ссылка в профиле

  • @artemunix5223
    @artemunix5223 Год назад

    покажешь как с апи twitter facebook tiktok telegram google работать?