Вот это:
for item in Model.objects.filter(p1='s1'):
pass
точно так же загрузит все данные в память. Запрос выполнится сразу, как начнется итерация; результат (весь) попадет из сервера БД в питоний драйвер БД (может что-то поменялось, но раньше большая часть драйверов БД не поддерживали постепенное получение результатов, или джанга их так использовала). А потом джанга будет создавать экземпляры модели постепенно (и запоминать/кешировать их). Отличие от варианта с list() в том, что при варианте с list() все экземпляры моделей создадутся сразу. Короче, непонятно, отчего способ с list() может быть в разы быстрее, или требовать больше памяти, тут по сути одно и то же происходит. Мне кажется, @Imposeren что-то путает тут.
Чтоб не кешировать экземпляры моделей, можно использовать вот такую конструкцию:
for item in Model.objects.filter(p1='s1').iterator():
pass
вот это будет требовать меньше памяти, т.к. экземпляры моделей внутри кверисета кешироваться не будут. Это означает, например, что при повторной итерации будет выполнен еще один sql-запрос. Ну и с этим способом все равно можно потратить много памяти (хотя и меньше, чем без .iterator()), если драйвер БД (и его связка с джангой) не поддерживает итерацию, а вытаскивает с сервера все сразу.