본문 바로가기

programming/python, django

django ORM과 queryset

django는 기본적으로 ORM을 제공한다. ORM은 쿼리문의 방대한 보일러 플레이트 코드를 줄여주는 장점이 있지만, 그렇다고 쿼리문을 모르고 사용해선 안되며 몇가지 복잡한 상황에서는 역효과가 나는 단점이 있다. 또 학습량이 늘어나기도 하기 때문에 마냥 좋다고 볼 수는 없다. 어쨌든 django에서 데이터를 가져오는 방법을 살펴보자.

 

queryset = Task.objects.filter(due__lt=timezone.now()).order_by('-due')

 

이런식으로 메소드 체이닝 방식으로 데이터를 가져오며, queryset instance로 반환된다. 확인해보기 위해 shell을 작성해보자

 

 

 

 

queryset instance가 있고, Task object 배열이 담겨져있다.

하지만 실제로 데이터베이스를 히트하고 fetch하는 시점은 template에서 iterator를 도는 시점이다.

 

 

 

 

 

 

실제로 queryset이 evaluate되는 시점은 다음과 같다

  • iteration
  • slicing
  • pickling, caching (직렬화 시점)
  • len(), list(), bool()
  • python interpreter 출력 (위에 예시 경우)

 

lazy loading이 일어나므로, 로딩 시간 지연이나 N+1 문제를 발생시킬 수 있다. 이 경우는 eager loading을 적용시킬 수 있으니 상황에 따라서 적절한 대처방법을 적용해야 한다.