개발자 블로그

[Django ORM] 3. Lazy Loading & Caching 본문

Django/Django ORM

[Django ORM] 3. Lazy Loading & Caching

hayongwoon 2022. 5. 3. 23:23

Lazy Loading

QuerySet의 특징으로는 Lazy Loading, 지연 로딩이 있다. 지연 로딩은 QuerySet을 evaluation 하기 전까지 QuerySet에서 filter()를 추가하고 exclude() 하는 것은 데이터베이스에서 쿼리를 수행하지 않는다. QuerySet을 evaluation하는 방법은 여러 가지가 있다.

len() , list() , bool() , repr() 등을 QuerySet에 사용했을 때 QuerySet은 evaluation 되고 실제로 데이터베이스에서 쿼리를 수행하게 된다.

 

Caching

각 QuerySet은 데이터베이스로 접속을 최소확 하기 위해 cache를 갖고 있다. QuerySet이 Evaluation 되기 전엔 cache가 비어있지만 evaluation 후에 쿼리 수행 결과를 cache에 저장해 둔다.

results = Product.objects.filter(name__startswith='The')
print([result.name for result in results])
print([result.price for result in results])

위와 같은 코드를 사용하면 두 번째 줄에서 쿼리가 수행되고 세 번째 줄에선 위에서 cached된 QuerySet을 사용하므로 총 한 번의 쿼리만 수행된다.

print([result.name for p in Product.objects.all()])
print([result.price for p in Product.objects.all()])

하지만 위의 코드는 QuerySet을 저장하지 않고 쓰므로 두 번의 쿼리가 수행된다.

 

참고 블로그 : https://medium.com/@likegondry/django-queryset-caching-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-c4966e4c91c6

'Django > Django ORM' 카테고리의 다른 글

[Django ORM] 4. EagerLoading  (0) 2022.05.03
[Django ORM] 2. QuerySet을 잘 사용하는 법  (0) 2022.05.02
[Django ORM] 1. QuerySet  (0) 2022.04.28
Prolog. 참고 문서 및 블로그  (0) 2022.04.22