Этот вопрос раскрывается
тут.
.all() возвращает копию текущего QuerySet для последующей фильтрации или передачи в менеджер модели, когда нужно получить именно QuerySet
Помимо этого - этот QuerySet кешируется, поэтому если данные в БД изменились - можно получить результаты повторно вызвав .all() для выражения.
.filter() также возвращает QuerySet
Поэтому записи означают:
Entry.objects.all().filter(pub_date__year=2006) - получить копию queryset, и вернуть отфильтрованный queryset
Entry.objects.filter(pub_date__year=2006).all() - получить отфильтрованный queryset и вернуть копию этого queryset
а поскольку .filter() и так возвращает отфильтрованный queryset - то .all() в данном случае можно опустить
type(Entry)
class 'django.db.models.base.ModelBase'
type(Entry.objects)
class 'django.db.models.manager.Manager'
type(Entry.objects.all())
class 'django.db.models.query.QuerySet'
type(Entry.objects.all().(pub_date__year=2006))
class 'django.db.models.query.QuerySet'
синтетический пример:
query = Entry.objects # - в query менеджер некоей модели
for obj in query.all(): # вывели объекты
print(obj)
... # тут к примеру проделали определенные манипуляции с некоторыми объектами
for obj in query.all(): # вывели обновленный список объектов
print(obj)