Бекенд на Django, Урок 9: Оптимизация SQL запросов в ORM

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

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

  • @Sergey-cz7ym
    @Sergey-cz7ym Год назад +2

    у меня, что бы заработала django-admin-panel, надо было установить django_extensions и в settings дописать:
    import mimetypes
    mimetypes.add_type("application/javascript", ".js", True)

  • @user-lc1ni8zd8v
    @user-lc1ni8zd8v Год назад +11

    Первый на кого я попал по урокам джанго. Сначала я подумал курс какой-то непонятный. В силу своих слабых знаний, я не мог понять всю силу этого курса,
    А теперь я понимаю, что это лучший курс по джанго , особенно по ресту. Спасибо за предоставленные знания

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

      Посмотрите новый !

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

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

  • @andvit77766688
    @andvit77766688 3 года назад +32

    Самый лучший курс по django который я встречал как на русскоязычном ютубе, так и на англоязычном. Мало кто заморачивается и рассказывает про тестирование и оптимизацию SQL. Хотелось бы посмотреть еще более подробно про ORM, а также про работу с сокетами в django.

    • @progmain5237
      @progmain5237 2 года назад +1

      солидарен полностью!!! обычно курс такой же как и другие на 90%. Тут, для меня (новичка), почти все новое. Спасибо автору за его старания!

  • @alexseydugin8109
    @alexseydugin8109 Год назад +4

    ДЗ
    1) Убираем select_related('owner) пишим внутри annotate: owner_name=F('owner__username')
    2) Вместо prefetch_related('readers') пишим prefetch_related(Prefetch('readers', queryset=User.objects.all().only('first_name', 'last_name'))
    Запрос хорошо так сжимается в итоге

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

      Это мне ДЗ? Ну спасибо 😁

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

      Вау. Про F('owner__username') догадался почти сразу, а вот про prefetch_related(Prefetch('readers', queryset=User.objects.all().only('first_name', 'last_name') вообще не знал. Ща буду изучать, спасибо ;)

    • @haydarshohshirinov1602
      @haydarshohshirinov1602 10 месяцев назад

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

  • @user-it3wi6ct8t
    @user-it3wi6ct8t 3 года назад +11

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

  • @a98cb985
    @a98cb985 Год назад +3

    И снова спасибо!
    Про дз для уменьшения полей можно убрать select_related и использовать django.db.models.F
    Для prefetch_related - django.db.models.Prefetch, в котором в queryset использовать метод only

  • @Pro-qq4pt
    @Pro-qq4pt 3 года назад +5

    Огромнейшее спасибо! Это лучший курс по Django из всех, что видел!

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

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

  • @kaluginpeter
    @kaluginpeter 6 месяцев назад

    Не знал, что Томас Шелби в программирование умеет. Спасибо за ролик!

  • @lionshg
    @lionshg 4 года назад +7

    Очень полезная и нужная тема, спасибо!

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

    Здравствуйте еще раз!
    Я за всю свою жизнь не писал столько комментариев, как вам под ваши видео.
    Еще раз хочу поблагодарить на прекрасный урок, ORM запрос получился вообще здоровый, но главное оптимизированный. Дз сделал, запрос получился еще более оптимизированее!
    Удачи вам в развитии!

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

      Супер! Раз что мои видео так вам подошли. Продолжайте в том же духе!

  • @wissarius
    @wissarius 4 года назад +2

    Радуют новые видео! Благодарю за контент! п.с.: при удалении строки в pycharm удобно использовать команду cmd+delete (на macos)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Спасибо. Знаю , использую ) может не всегда

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

    Хороший курс, подробно объяснил, спасибо)

  • @ВалентинаЛетра
    @ВалентинаЛетра 4 года назад +2

    Спасибо, продолжайте

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

    спасибо!👍

  • @mediacontent3988
    @mediacontent3988 2 года назад

    Большое спасибо за ценную информацию

  • @cherkasovv4137
    @cherkasovv4137 2 года назад +3

    Хотел посмотреть чисто этот урок, чтобы освежить память - по итогу пересмотрел весь курс
    У тебя есть бусти? патреон ? Может будешь делать какие-то платные курсы?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Спасибо за такую инициативу! Пока меня нет на этих платформах. Может будут платные курсы, подумаю . Точно ещё будут бесплатные.

  • @dizzivoneverec2737
    @dizzivoneverec2737 3 года назад +1

    Пишу комментарий чтобы по быстрей вышли новые ролики))

  • @jimlabable
    @jimlabable 3 года назад

    Спасибо, такого нигде не видел. По ДЗ получилось убрать лишние поля через аннотате, правда средняя скорость не уменьшилась. Кстати наверняка здесь есть возможность посчитать среднюю скорость запросов и потом сравнить, при разных настройках. Кстати для ДЗ еще пришлось убрать из аннотате .select_related('owner'), иначе поля все равно выгружались все.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +2

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

  • @privetabdul
    @privetabdul 3 года назад

    Лучший !

  • @madwork
    @madwork 4 года назад +1

    сир помидор, спасибо за урок, он пришелся как раз вовремя. когда я задумался о том, почему дебагер ругается на скорость, пофиксил почти всё благодаря тебе. очень жду урок по правам и модерации, очень надеюсь, что он у тебя в планах. если нет, то, может, сделаешь какой-то экстра ролик? или дай что почитать, пока нагугливается только говно, а что-то ценное чрезвычайно медлено находится на stackoverflow. да и вообще все уроки в тырнетах, в отличие от твоих не имеют ничего общего с реальными проектами, которые окажутся в сети.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Хах. Спасибо! По правам уже есть один урок . По модерации пока нет. В принципе, я хотел рассказать о FSM на примере модерации, но не уверен что получится ближайшее время . Тема большая . А что конкретно хотелось узнать о правах и модерации ?

  • @watercrow1866
    @watercrow1866 4 года назад +1

    Спасибо за урок! Очень интересно и ешё более полезно! Так что же это получается, annotate стоит использовать всегда, когда это только возможно?
    Задание норм =)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Ну всегда, когда это нужно. А если annotate экономит нам запросы то можно смело использовать для этих целей .

  • @rostislavmalyshev1775
    @rostislavmalyshev1775 3 года назад

    Спасибо за видео! Полдня потратил, но так и не удалось запустить последнюю версию django-debug-toolbar 3.2 , которую PyCharm ставит по умолчанию. А также 3.0 и 3.1. Пришлось откатится на 2.2 - все работает. Гугл говорит, что это не редкая проблема. (Django 3.1.5)

  • @yureeek2067
    @yureeek2067 3 года назад +3

    тулбар активировался только после:
    1. manage.py collectstatic
    2. For Windows, you need to edit the registry. Set HKEY_CLASSES_ROOT\.js\Content Type to text/javascript.

  • @obe1313
    @obe1313 4 года назад +1

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

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +4

      Тема для ещё одного видео )

    • @arsenii7993
      @arsenii7993 3 года назад +3

      используй бибилиотеку rest-auth там готовая аутентификация из коробки по токенам и сессиям и jwt токенам также, на email приходит письмо с сcылкой когда юзер нажимает на ссылку на клиенте должен быть этот урл обрабатывается и слаться запрос на сервер с uuid, token которые нужно получит из урла

  • @AlexGott
    @AlexGott 4 года назад

    Это было "вау"

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

    Кто нибудь знает почему 0 sql запросов? хотя все миграции таблицы существуют

  • @koshakpoc2876
    @koshakpoc2876 2 года назад

    сеньёр, а можно ли вообще сделать select_related для поля с ForeignKey и без read_only?
    проще говоря у книги есть поля категория, которое связано с моделью CategoryModel
    если в сериализаторе указать category = serializers.CharField(source='category.id'), то в тесте update говорится
    что это поле либо должно быть read_only=True, либо не должно содержать .id
    если убрать .id , то говорится что нет смысла делать category = serializers.CharField(source='category)
    в итоге чтобы все работало дополнительный sql запрос для category остается
    если способы как это оптимизировать ?

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

    Как в таком случае фильтровать, например, по количеству лайков?

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

    Насколько я понимаю, в DRF мы берем переменную queryset и в неё через аннотации передаем множество полей, которые хотим увидеть в конечном json формате?
    Т.е. тут нет такого, как в обычном Django, где мы, допустим, делаем квери запросы и передаем их в контекст под разными именами? Или в DRF это тоже имеет место быть, но нужно уже метод get_queryset писать?

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

      Сори, может не очень понял вопрос.
      ORM одинокого работает в Django и DRF. Мы можем сами формировать response во вью , и тогда как-бы словарь , который мы формируем для response будет аналогично как контекст во вью с шаблоном .
      А можем это сделать в get_queryset если это Api View. Можно через сериализатор типа автоматически.
      Но в аннотации мы не определяем список полей , которые хотим увидеть в JSON. Мы там создаем только те поля, которых нет в базе и это скорее исключительный случай

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

      @@SeniorPomidorDeveloper аа, понял, спасибо! Да, вы меня правильно поняли)

  • @ipypypy
    @ipypypy 3 года назад +1

    Варламов программировать начал?)

  • @НикитаЗарецкий
    @НикитаЗарецкий 4 года назад +1

    домашнее задание делается через owner_name=F('owner__username'), без select_related?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад +1

      Похоже на правду

    • @НикитаЗарецкий
      @НикитаЗарецкий 4 года назад

      @@SeniorPomidorDeveloper а будет видео про imagefield?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Мм . Не уверен, может позже. Это там через api это по особенному делается . Но идея хорошая, согласен

    • @lightkingbeknazarov7919
      @lightkingbeknazarov7919 3 года назад

      извините, можете показать код где
      это пишете? у меня не получается

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад

      @@lightkingbeknazarov7919 не буду спойлерить )

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

    Доброго времени суток! Может, подскажете, я далеко не опытный разработчик, может подскажете или наведете на путь, вот проходил курсы в первый раз у вас очень давно, на работу устроиться получилось, но не совсем по джанго, но все равно ваши курсы помогли очень ) и вопрос такой встал, что все же хочу стать именно веб разработчиком, но задался вопросом, а может все таки не Джанго, а использовать другой язык и фреймворк. Понимаю, что это все инструменты и они достигают одни и те же цели примерно, но почему то часто сталкиваюсь с вакансиями по Java spring boot, php symphony и задумался, почему их так много и закралась мысль, что может и не в том направлении я изучил и изучаю веб, точнее, не с тем языком.. может у вас какие мысли есть на этот счёт ? Просто хотя бы рассуждения, может они мне помогут поставить все точки над и)

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

      Добрый день! Рад что получилось найти работу, сейчас очень большая конкуренция среди Джуниоров . Сравните именно количество вакансий. По python я думаю что больше чем по Java или php. А по Django наверно больше чем по другим веб фреймворкам.
      Но если интересно что-то другое то это очень хорошо! Php изучать не советую , он уже очень устарел и его везде вытесняет python . Java все еще актуальный язык в интерпрайс сегменте (банки и тд) , большой бизнес , не стартапы. Сложность только в том что он очень сложный и потребуется много времени. Но если к питону вы знаете какой-то строгий ООП язык, это большой плюс в резюме .
      Советую обратить внимание на Go или он же Golang. Вот он сейчас очень в тренде и во многом обыгрывает питон в плане веба, намного быстрее и не такой сложный как Java. Многие компании в дополнение к сервисам на питоне пишут микосервисы на Go. Думаю за ним будущее , если он питон в вебе не вытеснит , то точно потеснит его неплохо

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

      @@SeniorPomidorDeveloper да, спасибо огромное ! Как раз Golang по работе тоже требуется, изучаю и применяю его тоже, правда у него своеобразное ООП )) а так да, микросервисы прям хорошо заходит, после си как раз питон изучал , вот ваши курсы в том числе и Golang вот по работе тоже )

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

      @@SeniorPomidorDeveloper тогда продолжу изучать веб с Джанго и питоном, а там если потребуется перейти я думаю попроще будет, чем с нуля изучать все )

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

      Ну отличный набор! Думаю этого вполне достаточно

  • @aramsimonyan9067
    @aramsimonyan9067 4 года назад

    здравствуйте сениор помидор,видео как всегда отличное,но у меня есть один error,который не знаю как исправить, после того,как скачал и установил debug-tooler,
    но после этого,когда я выхожу из админки и пробую опять логинитья приходит такое сообщение "302 Found
    Location: /admin/login/?next=/admin/
    The Django Debug Toolbar has intercepted a redirect to the above URL for debug viewing purposes. You can click the above link to continue with the redirect as normal. "
    После этого,когда в django-swagger-е стал логиниться,сайт стал не понимать,что я логинюсь.Как все это настроить?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

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

    • @aramsimonyan9067
      @aramsimonyan9067 4 года назад

      Senior Pomidor Developer если честно гуглил,но не нашел ничего...думал вы сталкивались.Спасибо за ответ!

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  4 года назад

      Вот что нашёл stackoverflow.com/questions/33545798/the-django-debug-tool-lead-to-an-redirect-loop-on-admin-site и github.com/jazzband/django-debug-toolbar/issues/996

    • @aramsimonyan9067
      @aramsimonyan9067 4 года назад

      Senior Pomidor Developer посмотрю,спасибо.

    • @aramsimonyan9067
      @aramsimonyan9067 4 года назад

      Senior Pomidor Developer кстати,есть еще один вопрос,хотел-бы задать.
      Есть тестовое задание.
      Сайт,где при выборе фильма для просмотра генерируется ссылка,после чего,когда отправляете ссылку другу,вы можете смотреть фильм вдвоем и переписываться.Вы знаете как это создать через django rest framework или нет?

  • @koshakpoc2876
    @koshakpoc2876 2 года назад

    django-debug-toolbar не работает(

    • @koshakpoc2876
      @koshakpoc2876 2 года назад +1

      нашел решение
      нужно в urls.py в условие if settings.Debug добавить следующие строки:
      import mimetypes
      mimetypes.add_type("application/javascript", ".js", True)

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      Ого 😱

  • @iscultas
    @iscultas 3 года назад +1

    Оптимизация SQL запросов в ORM - не используйте ORM.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +2

      Тоже вариант, хотя никто не мешает написать кривой и медленный SQL.

    • @iscultas
      @iscultas 3 года назад

      @@SeniorPomidorDeveloper Поэтому нужно учить SQL.

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  3 года назад +2

      Нужно

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

      @@iscultas все равно джун очень вряд-ли напишет запрос лучше, чем это делает ОРМ

  • @archyt88
    @archyt88 2 года назад

    Рофлан в том что без этого крутого toolbara сайт грузится раз в 8 быстрее, и если что то и надо оптимизировать, то логику отслеживания тулбаром чего либо, ибо она некорректна

  • @oneaskren1735
    @oneaskren1735 2 года назад

    Немного не понял почему при тестировании мы создали имя фамилию пользователю но никак не прописали что все пользователи читают все книги и тест спокойно прошел. Или в шести строках "UserBookRelation.objects.create(user=user1, book=book_1, like=True, rate=5)" про это и указывается автоматически?

    • @SeniorPomidorDeveloper
      @SeniorPomidorDeveloper  2 года назад

      UserBookRelation это про доступность книг и кто их читает. Это просто лайки и рейтинг . Вроде так было..

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

    ordered dict != dict? AssertionError: [OrderedDict([('id', 1), ('name', 'Test bo[674 chars]])])] != [{'id': 1, 'name': 'Test book_1', 'price':[504 chars]2}]}]

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

      Надо принтами оба результата запринтить и глазами сравнить

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

      @@SeniorPomidorDeveloper идентичны. Кроме того что одни являются диктами а вторые ордеред диктами

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

      Не. Assert эту разницу игнорирует, он умеет сравнивать dict и ordered dict. Это можно отдельно проверить чтобы убедиться. В чем-то еще дело

    • @Developer_python_
      @Developer_python_ 11 месяцев назад +1

      @@SeniorPomidorDeveloper спасибо за ответ! Всех благ тебе и процветания!!! Я уле писал но скажу ещё раз: это самые стоящие уроки в русскоязычном сегменте. Как идею для дополнения роликов было бы круто осветить возможности для ВСЕХ типов сериализаторов. Добра тебе!!!!

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

      Спасибо большое!