Не получается 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
join случается, если делать select_related
префетч делается в два запроса - сначала изначальный запрос, а потом связанные с ним объекты. мерж этих запросов происходит в рантайме
можно почитать тут: https://medium.com/better-programming/django-select-related-and-prefetch-related-f23043fd635d
Благодарю Вас, Илья. Долго разбирался, стало понятно!
Там самое сложное, что дальнейшие query не может быть filter или get- тогда prefetch не срабатывает. Сейчас пока я все сделал на select_related и своем cache.
это да. и правильнее всего было бы сделать все фильтрации и только в самом конце вызвать prefetch_related
например, если все это уходит в шаблон, я бы поступил следующим образом: