출처 : Django ORM 김성렬씨의 PyCon Korea 2020
이 게시글은 김성렬씨의 강의를 보고 만든 게시글입니다.
제 게시글을 보는것 보다 해당 영상 강의를 듣는게 훨씬 이해가 잘 되실 겁니다.
iteration
slicing
repr()
len()
count()
list() 등등
위의 method가 실행될 때 QuerySet이 평가(Evaluate) 된다고 판단. 쿼리셋이 실제 사용되는 것.
Django는 QuerySet을 평가(Evaluate)될 때까지 실제로 DB 활동이 발생하지 않기 때문에, DB와 충돌하지 않고 필터링, 슬라이스 등을 할 수 있다.
여기서 말하는 평가(Evaluate)는 실제로 데이터베이스에 도달하는 것을 의미함.
users = User.objects.all()
users = User.objects.all()
user_list = list(users)
위의 예제들로 알 수 있는것은 정말 필요한 시점에만 ORM은 SQL을 호출해서 데이터를 가지고 온다.
users = User.objects.all()
orders = Order.objects.all()
companies = Order.objects.all()
user_list = list(users)
users = User.objects.all()
first_user = users[0]
user_list = list(users)
하지만 실제 SQL은 그렇지 않다.
위의 사진에서 볼 수 있듯이, first_user 즉 전체 쿼리셋의 0번째에 접근을 한것을 LIMIT 1 SQL 을 이용해서 한명만 따로 받아오고 user_list에 저장하기 위한 코드는 다시 전체 User를 불러오는 SQL을 실행하게 된다.
우리가 기대한 것은 단 한번의 전체 User를 호출하는 SQL인데, LIMIT 1 이라는 쓸데없는 SQL이 실행된 것이다.
QuerySet 캐싱을 재사용하는 방법
users = User.objects.all()
user_list = list(users)
first_user = users[0]