Django는 evaluation이라는 개념이 있다.
Query가 평가되지 전까지는 데이터 베이스의 활동이 일어나지 않는 것이다.
아래는 queryset이 어떤 상황일때 execution되는지 나와 있는 것.

자료 출처 : 유튜버 미쿡엔지니어
쿼리셋은 순회가능 (iterable) 객체이며, 쿼리셋을 순회하는 순간 데이터베이스에 쿼리를 실행해 쿼리셋에 담긴 레코드들을 불러오게 된다.
for entry in Entry.objects.all():
print(entry.headline)
쿼리셋은 Python의 슬라이싱 문법을 사용해서 슬라이싱 할 수 있다.
Entry.objects.all()[:5]
위와 같은 경우에는 모든 레코드들의 쿼리셋에서 5개의 레코드만 가지는 쿼리셋을 새로 생성하여 리턴하며, 이 때 쿼리셋은 평가되지 않는다. 그러나 아래와 같이 스텝을 사용한 슬라이싱을 실행한 경우, 쿼리셋이 평가되며 그 결과를 리스트로 반환한다.
Entry.objects.all()[:5:2]
피클링/캐싱에 대한 자세한 내용은 다른 포스트를 참고하기 바란다. 여기서 알아야할 점은 피클링/캐싱을 하는 경우 데이터베이스에서 쿼리셋 결과를 읽어온다는 점이다.
쿼리셋에 repr() 함수를 적용하는 경우 쿼리셋이 평가된다. 이는 Python 인터렉티브 인터프리터에서 API를 사용해 쿼리셋을 가져온 다음 결과를 즉시 확인하고자 할 때를 위한 편의기능이다.
쿼리셋에 len() 함수를 적용하는 경우 쿼리셋이 평가된다. 쿼리셋에 포함된 데이터의 개수를 리턴한다.
만약 실제 데이터는 필요하지 않고 그 개수만 확인하려는 경우 SQL 문의 SELECT COUNT(*) 를 사용하는 것이 훨씬 효율적이며, Django 에서는 이 명령을 실행하는 count() 함수를 제공한다.
list() 를 사용하는 경우
list() 함수를 통해 강제로 쿼리셋을 평가할 수 있다.
entry_list = list(Entry.objects.all())
bool(), and, or, if 등으로 쿼리셋을 검사하는 경우 쿼리셋이 평가된다. 이 경우, 쿼리셋에 값이 하나라도 있으면 True, 아니면 False 가 된다.
단순히 쿼리셋에 하나 이상의 값이 있는지를 확인하고 싶다면, exists() 를 사용하는 것이 효율적이다.