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

Поділитися
Вставка
  • Опубліковано 31 тра 2024
  • 00:00 про ORM и SQL
    02:15 как логировать SQL query
    07:20 находим источники SQL запросов в коде
    12:30 делаем prefetch_related
    17:43 класс Prefetch для ORM
    20:25 select_related
    24:25 делаю git commit и git push
    24:43 добавляем вложенный сериализатор
    27:15 устраняем проблему n+1
    31:25 на что обратить внимание при разработке view

КОМЕНТАРІ • 98

  • @nikez600
    @nikez600 7 місяців тому +4

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

  • @bernardsoul8936
    @bernardsoul8936 26 днів тому +1

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

  • @koloboopsik
    @koloboopsik Рік тому +9

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

  • @Alekseyild
    @Alekseyild Рік тому +2

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

  • @unaibekovbakhyt6517
    @unaibekovbakhyt6517 Рік тому +1

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

  • @user-gd6dd3xi9r
    @user-gd6dd3xi9r Рік тому +4

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

  • @Pavel-er4hy
    @Pavel-er4hy Рік тому

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

  • @airguy5964
    @airguy5964 Рік тому +1

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

  • @Developer_python_
    @Developer_python_ 2 місяці тому

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

  • @Bibliophilos
    @Bibliophilos Рік тому +9

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

    • @Igor160594
      @Igor160594 9 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  9 місяців тому

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

  • @axeaxe1819
    @axeaxe1819 Рік тому

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

  • @nvkey
    @nvkey 2 місяці тому

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

  • @JohnKannedy
    @JohnKannedy 10 місяців тому

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

  • @user-kn5ip9lr6r
    @user-kn5ip9lr6r 6 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  6 місяців тому

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

    • @user-kn5ip9lr6r
      @user-kn5ip9lr6r 6 місяців тому

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

  • @alexdzehil7194
    @alexdzehil7194 Рік тому +1

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

  • @jamjam3337
    @jamjam3337 3 місяці тому

    спасибо!😎

  • @dodokwak
    @dodokwak Рік тому

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

  • @SeliverstovMusic
    @SeliverstovMusic Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому +1

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

    • @alexdzehil7194
      @alexdzehil7194 Рік тому

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

  • @user-tw3kt9ns4m
    @user-tw3kt9ns4m Рік тому

    Grazie Senior

  • @user-vl1el8bp7y
    @user-vl1el8bp7y Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

    • @user-vl1el8bp7y
      @user-vl1el8bp7y Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

    • @user-vl1el8bp7y
      @user-vl1el8bp7y Рік тому

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

  • @user-ik4ky1yw2e
    @user-ik4ky1yw2e Рік тому

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

  • @ibrahimoglu
    @ibrahimoglu Рік тому

    👍

  • @begula_chan
    @begula_chan 11 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 місяців тому +1

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

    • @begula_chan
      @begula_chan 10 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 місяців тому +1

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

    • @begula_chan
      @begula_chan 10 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  10 місяців тому +1

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

  • @user-wt6sv8ys5r
    @user-wt6sv8ys5r 5 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  5 місяців тому

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

  • @BorisenkoV89
    @BorisenkoV89 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому +1

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

  • @vladislavr5390
    @vladislavr5390 Рік тому

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

  • @gvadellupa9335
    @gvadellupa9335 Рік тому

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

  • @user-fo8yv6cf9h
    @user-fo8yv6cf9h Місяць тому

    thanks

  • @ClinKZKZKZ
    @ClinKZKZKZ Рік тому

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

  • @abduraxmon9804
    @abduraxmon9804 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому +1

      github.com/chepe4pi/service_app

    • @user-yo1gf7ks1g
      @user-yo1gf7ks1g Рік тому

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

  • @karasik5695
    @karasik5695 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

    • @karasik5695
      @karasik5695 Рік тому

      @@SeniorPomidorDeveloper все равно спасибо, прекрасный курс

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

  • @zhivokost36
    @zhivokost36 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

  • @nikitakurabtsev1222
    @nikitakurabtsev1222 Рік тому

    если .prefetch_related('plan') заменить на .select_related('plan') вместо 3 запросов будет 2, потому что будет джоин Subscription вместе с Plan таблицей.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

      Насколько мне известно, prefetch related и select related, сделаны для разных видов связей .
      Я проект уже удалил , но может кто-то из подписчиков перепроверит, интересно найти самый оптимальный вариант

    • @dmytrokovalov2199
      @dmytrokovalov2199 11 місяців тому

      select_related для O2O, FK, а prefetch_related для M2M

  • @user-ed6cn1eo6f
    @user-ed6cn1eo6f Місяць тому

    Спасибо, все круто, но как настроить вывод в pycharm console?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Місяць тому

      Если PyCharm professional там вроде по умолчанию это работает

    • @user-ed6cn1eo6f
      @user-ed6cn1eo6f Місяць тому

      @@SeniorPomidorDeveloper а еже ли я из простого народа, просто сталкивался раньше с этим, не могу никак найти решения в тыртырнете, мистор сеньер помидор. абалденный ник

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Місяць тому

      Спасибо 😁
      Не очень понял что имеется ввиду. Если консоль Джанго то это только а Pro версии. Если терминал ОС то он вроде в любой версии и настраивать его не надо

    • @user-ed6cn1eo6f
      @user-ed6cn1eo6f Місяць тому

      ​@@SeniorPomidorDeveloper Проблема была не в том что я запускал из pycharma, а неизвестно где, ибо я только что запустил из консоли и там тоже ничего не выводиться.

    • @user-ed6cn1eo6f
      @user-ed6cn1eo6f Місяць тому

      @@SeniorPomidorDeveloper ладно, как обычно ахах, было django.db.backend а не django.db.backends

  • @andreykuskov8807
    @andreykuskov8807 Рік тому

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

  • @cristianglodeanu2329
    @cristianglodeanu2329 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

  • @Chel1k7
    @Chel1k7 11 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  11 місяців тому

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

    • @Chel1k7
      @Chel1k7 11 місяців тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  11 місяців тому

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

  • @pretcb
    @pretcb Рік тому

    +

  • @sergeyly5438
    @sergeyly5438 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому +2

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

    • @sergeyly5438
      @sergeyly5438 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

    • @sergeyly5438
      @sergeyly5438 Рік тому

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

    • @Bibliophilos
      @Bibliophilos Рік тому

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

  • @NikolayN707
    @NikolayN707 Рік тому

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  Рік тому

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

  • @artemunix5223
    @artemunix5223 9 місяців тому

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