D
Diregent18 января 2021 г. 5:53

Не получается prefetch_related на M2M полях

Приветствую! работаю над волонтерским проектом, изучаю django. Очень понравилась тема про оптимизацию запросов к БД и вообще весь сайт!
Но у меня в model- ManyToManyField через through модель, где 2 ForeignKey- все как обычно. На stackoverflow есть вопросы об этом, из которых вроде следует, что надо делать prefetch_related(Prefetch("поле м2м"), ThroughModel..select_related("поле foreign key"), но QuerySet.query показывает, что никакого join не происходит:( пробовал и поля указывать через model__field- тоже самое...

А еще пагинация... Изначальный запрос даже если и за-join-ится, то вернет ~50 тыщ рядов. Я хотел взять QuerySet после панинации для 1 page, на нем сделать select/prefetch related- может так меньше рядов потянет? я даже от отчаяния уже начал конвертить queryset в свои классы, в которые сам сделаю запросы в БД, как нужно, но это совсем не стандартно, и в Paginator такой класс не подсунуть.

Вот такая печаль... Можно код показать?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

3
Илья Чичак
  • 18 января 2021 г. 7:01
  • Ответ был помечен как решение.

join случается, если делать select_related

префетч делается в два запроса - сначала изначальный запрос, а потом связанные с ним объекты. мерж этих запросов происходит в рантайме

можно почитать тут: https://medium.com/better-programming/django-select-related-and-prefetch-related-f23043fd635d

    D
    • 23 января 2021 г. 7:17

    Благодарю Вас, Илья. Долго разбирался, стало понятно!
    Там самое сложное, что дальнейшие query не может быть filter или get- тогда prefetch не срабатывает. Сейчас пока я все сделал на select_related и своем cache.

      Илья Чичак
      • 23 января 2021 г. 12:25

      это да. и правильнее всего было бы сделать все фильтрации и только в самом конце вызвать prefetch_related

      например, если все это уходит в шаблон, я бы поступил следующим образом:

      def some_view(request, *args, **kwargs):
          qs = SomeModel.objects.filter(...)
          if ...:
              qs = qs.filter(...)
          else:
              qs = qs.filter(...)
          qs = qs.exclude(...)
          return render(request, 'template.html', {'objects': qs.prefetch_related()}
      

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        AD

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:50баллов,
        • Очки рейтинга-4
        m
        • molni99
        • 26 октября 2024 г. 11:37

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:80баллов,
        • Очки рейтинга4
        m
        • molni99
        • 26 октября 2024 г. 11:29

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:20баллов,
        • Очки рейтинга-10
        Последние комментарии
        i
        innorwall16 ноября 2024 г. 18:33
        Qt/C++ - Урок 018. QGraphicsItem - наследование и СЛОТы where to buy priligy in usa Now let us do something for you
        i
        innorwall16 ноября 2024 г. 17:52
        Qt/C++ - Урок 063. Добавление окон внутри главного окна приложения с помощью QMdiArea Another thing that might help is Milk Thistle or dandelion root which help cleanse your liver as the liver plays a big part in getting that Estrogen out of your body priligy reddit
        i
        innorwall16 ноября 2024 г. 14:55
        Qt/C++ - Урок 036. QWebView - пишем простейший браузер на Qt Figure 7 The network of ОІ estradiol where to buy priligy usa
        i
        innorwall16 ноября 2024 г. 14:38
        Анонсирование Qt для MCU donde comprar priligy mexico If you have suppressed vitamin d this could be contributing to your Low T levels and all the bad things associated with that
        i
        innorwall16 ноября 2024 г. 14:05
        Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами 5 mg weight gain We thought price negotiation was a huge source of friction dapoxetine for premature
        Сейчас обсуждают на форуме
        i
        innorwall16 ноября 2024 г. 13:20
        добавить qlineseries в функции Bone densitometry is the most accurate clinical predictor of osteoporosis priligy medicine
        t
        tonypeachey115 ноября 2024 г. 17:04
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        i
        innorwall11 ноября 2024 г. 21:55
        Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
        9
        9Anonim25 октября 2024 г. 19:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Следите за нами в социальных сетях