ORM만 정의한다고해서 실행되는것이아닌 QuerySet이 평가될때 DB에 SQL문을 날려 통신한다.
QuerySet이 평가될때란?
파이썬의 generator라 생각하면 쉽다.
user = User.objects.filter(age='20') # 이 시점에는 SQL문을 호출하지않는다.
print(user) # QuerySet이 평가될때 SQL문으로 DB에서 데이터를 호출한다.
문제점
user = User.objects.filter(age='20')
print(user[0])
print(user[1])
# 두번 SQL Query가 호출된다
# category의 table에 id, name 있고
# product table는 id, name, category_id가 있다.
products = product.objects.filter(category_id = 1)
result = [{
"category_id : product.category.id,
"category_name : product.category.name,
"id" : product.id,
"name" : product.name} for product in products]
user = User.objects.filter(id = 1)
print(user[0]) # LIMIT 1이 포함된 SELECT문 호출
print(list(user)) # id가 1인 SELECT 문이 호출
# 두번 SQL Query가 호출된다
다만, QuerySet를 호출한뒤에 index, slice로 접근하면 cach를 사용할수있다.user = User.objects.filter(id = 1)
print(list(user)) # id가 1인 SELECT 문이 호출
print(user[0]) # print(list(user))에서의 SQL문 호출의 caching된 데이터 사용
# 한번 SQL Query가 호출된다