Mat1lda
@Mat1lda

Есть ли разница, в каком месте указывать all()?

Суть вопроса:
есть ли разница между

Entry.objects.all().filter(pub_date__year=2006)
и
Entry.objects.filter(pub_date__year=2006).all()
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
Этот вопрос раскрывается тут.

.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)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы