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

แชร์
ฝัง
  • เผยแพร่เมื่อ 28 ต.ค. 2024

ความคิดเห็น • 45

  • @whatif4225
    @whatif4225 7 วันที่ผ่านมา

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

  • @СергейГоцин
    @СергейГоцин ปีที่แล้ว

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

  • @oleg-petrov-diada
    @oleg-petrov-diada 8 หลายเดือนก่อน

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

  • @donfedor007
    @donfedor007 3 ปีที่แล้ว +2

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

    • @AndyPronin
      @AndyPronin  3 ปีที่แล้ว +2

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

  • @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 смешивать с логикой?

  • @xewuss3750
    @xewuss3750 3 ปีที่แล้ว +3

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

  • @ПуляевГригорий
    @ПуляевГригорий ปีที่แล้ว +1

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

  • @notjik
    @notjik ปีที่แล้ว

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

  • @st-tn5sk
    @st-tn5sk 2 ปีที่แล้ว +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 нужно НЕ указывать, т.к. результат немного не тот...

    • @katsuyorii
      @katsuyorii 11 หลายเดือนก่อน

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

  • @УмарШирваниев-в7ь
    @УмарШирваниев-в7ь 2 ปีที่แล้ว +1

    👍🏻👍🏻👍🏻

  • @Viktor-g8g
    @Viktor-g8g 2 ปีที่แล้ว

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

    • @AndyPronin
      @AndyPronin  2 ปีที่แล้ว +2

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

  • @МихаилГусев-э4с
    @МихаилГусев-э4с 9 หลายเดือนก่อน

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

  • @artouralty4658
    @artouralty4658 2 ปีที่แล้ว

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

    • @AndyPronin
      @AndyPronin  2 ปีที่แล้ว +1

      Думаю, 4й

    • @artouralty4658
      @artouralty4658 2 ปีที่แล้ว +1

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

  • @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 10 หลายเดือนก่อน

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

    • @scad_
      @scad_ 10 หลายเดือนก่อน

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

    • @databox4279
      @databox4279 10 หลายเดือนก่อน

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

  • @АлишерИвазов
    @АлишерИвазов ปีที่แล้ว +1

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

  • @kostya2186
    @kostya2186 2 ปีที่แล้ว

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

    • @AndyPronin
      @AndyPronin  2 ปีที่แล้ว +2

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

    • @tesmanit
      @tesmanit ปีที่แล้ว

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

    • @AndyPronin
      @AndyPronin  ปีที่แล้ว

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