언어/Python
TIL45 | QuerySetAPI - select_related & prefetch_related
lee365
2021. 11. 10. 11:58
반응형
select_related(*fields)
inner join
Foreign Key로 참조하고 있는 테이블을 inner join을 통해서 한번에 가져온다.
return QuerySet
plain lookups VS select_related() lookup
plain lookup
# Hits the database.
e = Entry.objects.get(id=5)
# Hits the database again to get the related Blog object.
b = e.blog
select_related()
# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)
# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog
prefetch_related(*lookups)
- 역참조 관계에 사용
My project 적용 😋️😋️😋️
현재 작업하고 있는 나이키 클론 프로젝트에 적용해보았다.
전체 상품 리스트를 조회 했을 때
select_related
와prefetch_related
를 사용하지 않았을 때 실행되는 쿼리의 수72
select_related
를 사용했을 때 실행되는 쿼리의 수58
select_related
와prefetch_related
를 사용했을 때 실행되는 쿼리의 수27
Source code
results = [{
...
} for product in Product.objects.filter(**filter_set)
.select_related('sub_category__main_category')
.prefetch_related('productoption_set__size', 'productoption_set__color')
.order_by(ordering)]
p = Product.objects.select_related('sub_category__main_category')\
.prefetch_related('productoption_set__size','productoption_set__color')
// select 4번 실행한다.
select * from products inner join sub_category inner join main
select * from product_options
select * from colors
select * from sizes
반응형