Django ORM. Оптимизация запросов к связанным моделям с помощью select_related и prefetch_related.

Поділитися
Вставка
  • Опубліковано 9 лют 2025
  • Частый вопрос на собеседованиях backend-разработчика.
    Оптимизируйте запросы к базе данных Джанго проекта.
    Хорошие ответы с примерами кода - в этом видео. Вы узнаете, как с помощью ORM писать эффективные SQL-запросы. Как их дебажить и сколько можно выиграть на хорошем запросе.
    Код проекта для тренировки и обучения:
    github.com/Cap...
    джанго дебаг тулбар
    django-debug-t...
    Задача:
    Провести оптимизацию запросов к базе данных во вью - функции item_detail
    Идеями и радостью того, что получилось с решением можно делиться в комментариях.
    Пару строчек кода, скорее всего, тоже будет норм (надеюсь, гугл не будет банить).
    Всем спасибо за просмотр! Ставьте 👍 если Вам понравилось видео!
    Нажимайте 🔔 чтобы видеть наши новые выпуски. За подписку - отдельная благодарность
    🔔ПОДПИСЫВАЙТЕСЬ:🔔
    🔗Вконтакте: CaptPronin
    🔗Facebook: / proninc
    #django #select_related #prefetch_related

КОМЕНТАРІ • 44

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

    Спасибо. Помогло оптимизация в асинхроне неаероятно важная вещь

  • @СергейГоцин
    @СергейГоцин Рік тому

    Благодарность спикеру , что он никуда не спешит. Спокойно, монотонно и все понятно. Это редкий случай когда я с первого раза посмотрел и во всем разобрался

  • @donfedor007
    @donfedor007 3 роки тому +2

    Вчера столкнулся с этим! Загуглил Вы выложили) Спасибо Вам за урок!

    • @AndyPronin
      @AndyPronin  3 роки тому +2

      Скоро ещё будет очень клёвый урок

  • @oleg-petrov-diada
    @oleg-petrov-diada 11 місяців тому

    Благодарю за видео, очень полезно!

  • @ioannp.5274
    @ioannp.5274 2 роки тому +22

    Андрей, не обижайтесь, но это видео - 100500е объяснение в стиле "посмотрите, вот сюда вставляем select_related, а сюда- prefetch_related и вместо 10 запросов у нас 1 или 2" . В чем ключевое отличие prefetch_related от select_related? Как они работают "под капотом"? Почему снова демонстрируется работа prefetch только для N:N ? В общем, если по select_related все относительно просто и понятно, то prefetch_related оставляет ощущение недосказанности, удивительно, что это касается 99% объяснительных статей про эти два метода.

    • @AndyPronin
      @AndyPronin  2 роки тому +6

      Спасибо за фидбек. Я уже подумываю переписать это дело.

    • @GOoD-vd5et
      @GOoD-vd5et Рік тому

      Зачем вам видео, когда у Джанги есть документация.
      "Почему снова демонстрируется работа prefetch только для N:N ? "
      В этом вопросе подразумевается связь m2m? Может потому что prefetch_related используется для m2m, а select_related в связях OneToOne и Foreign, не?
      Что за претензии непонятные.

    • @ioannp.5274
      @ioannp.5274 Рік тому +1

      @@GOoD-vd5et я уже не помню, что имел в виду, но скорее всего то, что джанго никак не запрещает использовать prefetch_related не только к m2m, но и к остальным типам связей. Думаю меня волновало, что происходит в этом случае и почему так делать нельзя или можно.

  • @margojazny
    @margojazny 2 роки тому +2

    Спасибо за инфу о Джанго-Тул-Бар.

    • @AndyPronin
      @AndyPronin  2 роки тому +1

      не перключайтесь. постараюсь подтягивать интересное

  • @lx5.47lk2
    @lx5.47lk2 2 роки тому +2

    Топчик!!

    • @AndyPronin
      @AndyPronin  2 роки тому +2

      На самом деле, нет. Мне за это видео очень стыдно. Запишу на канале от мидла и выше улучшенное и переоаботанное

  • @ibrahimoglu
    @ibrahimoglu 3 роки тому +2

    Очень крутая тема, спасибо за стрим.

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

    Добрый день Андрей. А вы не думали сделать видео о том как можно сделать например чистую архитектуру на джанго? А то тонкие вьюхи и толстые модели так себе паттерн)) model -> (repository, specifications) -> use case -> interactor -> controller -> view. А так получается по вашему видео то для того что бы бизнес логику протестировать нужно http запрос делать) Какой смысл инфраструктуру в виде моделей и http смешивать с логикой?

  • @Viktor-g8g
    @Viktor-g8g 2 роки тому

    Спасибо за видео. Очень хочется более сложных примеров, что-то с использованием класса Prefetch, так же хотелось бы рассмотреть raw и RawSQL

    • @AndyPronin
      @AndyPronin  2 роки тому +2

      Будет. Как раз готовлю материал

  • @st-tn5sk
    @st-tn5sk 3 роки тому +2

    пока в 2 запроса и то не нравятся они мне
    item = get_object_or_404(Item.objects.select_related('category').prefetch_related('tags'), pk=item_pk) так же работает как и item = get_object_or_404(Item.objects.select_related('category'), pk=item_pk), отсюда вопрос - можно ли так совмещать селект и префетч? и главный вопрос, насколько я понял основная разница между селектом и префетчом -
    это в том что селект джоинит таблицы на уровне SQL запроса, а префетч на уровне python ?

    • @GOoD-vd5et
      @GOoD-vd5et Рік тому

      Да, префетч на уровне питона.
      Если сделать джойн с таблицей со связью m2m, то будет дублирование строк, поэтому через SQL это сделать нельзя.
      В любом случае получается 2 запроса, если хотим все поля. Вопрос в автору, зачем поставил такое задание, может сам не был уверен.

  • @СергейГоцин
    @СергейГоцин Рік тому

    указывая 'values' мы получаем Queryset содержащий словарь, а когда 'values' Не указываем, то Queryset содержит объекты модели. И отсюда вылезают всякие трудности в дальнейшем. Как мне показалось 'values' при использовании prefetch_related нужно НЕ указывать, т.к. результат немного не тот...

  • @xewuss3750
    @xewuss3750 3 роки тому +3

    Безотносительно того, что у меня изначально показывает меньшее количество запросов. Самое простое - вместо "Item'" вставить уже оптимизированный querуset из первой функции.

  • @УмарШирваниев-в7ь
    @УмарШирваниев-в7ь 2 роки тому +1

    👍🏻👍🏻👍🏻

  • @notjik
    @notjik 2 роки тому

    А в классах представления это вшито автоматически или нужно вручную настраивать?

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

    А нельзя все эти 3,4, 5 запросов взять и объединить в пакет и выполнить за один раз(современные скули такое позволяют)?

  • @artouralty4658
    @artouralty4658 2 роки тому

    Подскажите, пожалуйста, на каком спринте вы проводили этот марафон?

    • @AndyPronin
      @AndyPronin  2 роки тому +1

      Думаю, 4й

    • @artouralty4658
      @artouralty4658 2 роки тому +1

      @@AndyPronin Обидно( Мы уже на 6-м, а про select_related и prefetch_related было только пару строк в теории

  • @ПуляевГригорий
    @ПуляевГригорий Рік тому +1

    Спасибо. Поржал.

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

    640х480???

  • @pashadem5820
    @pashadem5820 2 роки тому

    Решил так, но косяк в HttpResponseNotFound: try:
    item = Item.objects.all().select_related('category').prefetch_related('tags').get(pk=item_pk)
    except:
    return HttpResponseNotFound("No such element in the database")

    • @AndyPronin
      @AndyPronin  2 роки тому +1

      ох. Прям сложно. Препишу-ка я это видео. Кажется, там сильно лучше можно всё.

  • @scad_
    @scad_ 2 роки тому +2

    Какой-то препод так себе... Будто говорит, сам не знает о чем. В документации джанго очень подробно и понятно описывается про select и prefetch. Что select_related делает select(казалось бы), а prefetch это дополнительный join. Очень легко объясняется на схеме связанных таблиц, что даже если человек не знаком raw запросами, поймёт о чем речь. Ну и залитый файл на гит бд просто топ:))

    • @ioannp.5274
      @ioannp.5274 2 роки тому

      Что есть "дополнительный джойн"? Не встречал такого термина.

    • @scad_
      @scad_ 2 роки тому

      @@ioannp.5274 почитайте документацию, встретите

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

      что не так с залитой бд на гит, если это СПЕЦИАЛЬНО СОЗДАННЫЙ УЧЕБНЫЙ ПРОЕКТ!!!??? Экономия времени на миграциях, добавлении объектов в базу, которая будет стерта один фиг удалена после выполнения урока.

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

      @@databox4279 причём тут залитый файл в репо в контексте миграций? В .gitignore добавление одной строчки *.db решает этот вопрос.
      Вы бы прежде чем вещать, попытались бы хотя бы соотнести то, что пытаетесь сказать. А то прочитанное выглядит как чушь

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

      @@scad_ Вы вменяемый? Файл БД залит СПЕЦИАЛЬНО, что бы ученикам не пришлось создавать базу и наполнять её вручную. Это так сложно осознать?

  • @АлишерИвазов
    @АлишерИвазов Рік тому +1

    Чел сидит в кимоно?)))))

  • @kostya2186
    @kostya2186 2 роки тому

    Благодарен за труд, однако слишком душно... ни то ни се. никакой конкретики что, как и почему...

    • @AndyPronin
      @AndyPronin  2 роки тому +2

      Спасибо за отзыв. Я планирую переписать ролик. Больше на запросы образщать внимание, а не на синатксис Джанго ОРМ.

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

      @@AndyPronin здравствуйте. Вы уже перезаписали видео? Если да, то как его можно найти?

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

      @@tesmanit ещё нет. ( пока только для практикума уроки написал.