я загрузил некоторый список книг:
books = Book.objects.filter(id__gte=100)
Потом я захотел профильтровать queryset который получил выше.
Я делаю:
published_books = books.objects.filter(published=True)
Я просто усёк изначальный books queryset и получил более короткий published_books queryset.
В чем проблема: Каждый раз когда вызываешь filter на одном и том же queryset Джанга бежит делать новый запрос в базу. Даже если изначальный queryset уже был evaluated.
Что нужно: нужен способ предзагрузить books queryset, чтоб дальше по коду я мог делать get() и filter() на этом queryset НЕ ГОНЯЯ НОВЫЕ ЗАПРОСЫ. кто нибудь знает способ так сделать? Можно написать свои костыли, но хочется делать все максимально просто и понятно (пользуясь общепринятыми get filter) и не придумывая своих велосипедов.
когда ты делаешь .filter(…) джанго не «бежит делать новый запрос». Запрос выполняется когда ты итерируешься по списку или если .get() вызываешь
Ок. Как тогда делать filter на уже evaluated queryset не делая новых запросов?
именно filter никак потому что он строит SQL запрос
Обсуждают сегодня