All Articles

django - select_related()와 prefetch_related()

Foreign-key로 엮은 테이블 간 데이터를 불러올 때 데이터베이스에서 직접 꺼내오지 않고도 불어올 수 있는 방법이 있다. 쿼리 수를 줄여줌으로서 더 빠른 연산을 할 수 있다.

정참조 관계에서 사용하며, 일대일 필드 또는 foreign key를 걸어놓은 관계에서 사용할 수 있다. select_related()가 걸려 있는 변수를 선언한 순간 sql 상에서 테이블 조인이 일어나 쿼리 한 번으로 연결된 테이블의 데이터를 읽어올 수 있다.

select_related()를 사용하려면 쿼리문을 변수에 할당해주어야 한다. 변수를 실행하는 순간 테이블끼리 LEFT JOIN 해 데이터를 읽어온다.

select_related()는 일대일 또는 ForeignKey로 연결된 필드끼리만 사용할 수 있다면, prefetch_related()는 일대다, 다대다 관계에서도 사용할 수 있다. 역참조 관계도 가능. 쿼리 2번 실행 후 python에서 조인하기 때문에 아무 관계에서나 다 쓸 수 있다.

사용 예시

userid로 orders 테이블 데이터를 가져오기 `Order.objects.selectrelated(‘user’).get(id=1)`

상품 상세 이미지 중 모든 상품의 첫 번째 이미지만 불러오기

cart_items = Cart.objects.prefetch_related('order__product_color__product__color_set').prefetch_related('order__user__userproductcolor_set').filter(order_id = order_id)

for item in cart_items:
  item.product_color.detailimage_set.first().image_url