공식문서를 보다가 QuerySet이 lazy하다는 글을 봤다. 무슨 말이지? 싶었다.
핵심부터 말하자면, django ORM은 각 instance에 직접 접근할 때 비로소 쿼리문을 던진다는 것이다.
django ORM(object relational mapping)은 매핑을 하고 DB에 요청을 한다.
User.objects.all()
은 아직 DB에 요청을 한 게 아니다.
all_users = User.objects.all()
도 아직 DB에 요청을 한 게 아니다.
print(all_users)
가 되어야 DB에 요청을 하게 된다.
instance를 직접 가져오는 get
이나, 뒤져봐야 하는 exists
등은 함수를 호출하는 동시에 query문을 던지게 된다.
반면 QuerySet을 가져오는 all
, filter
, exclude
등은 함수를 호출한다고 해서 query문을 던지지 않는다.
대신 해당 QuerySet에 대한 정보에 접근할 때, 즉 print를 하는 등 사소하게라도 값에 접근하려고 할 때에야 query문을 진다.