반응형
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
반응형
'언어 > Python' 카테고리의 다른 글
TIL47 | Django Exceptions (0) | 2021.11.10 |
---|---|
TIL46 | Query Performance Counter Decorator (0) | 2021.11.10 |
TIL42 | Python에서 CSV파일 다루기(db_uploader.py) (0) | 2021.11.05 |
TIL41 | CodeKata 복소수 계산, 리스트 뒤집기 (0) | 2021.11.02 |
TIL39 | CodeKata 가장 자주 등장한 숫자 출력하기, 물을 담을 수 있는 가장 넓은 면적 (0) | 2021.10.29 |