TIL45 | QuerySetAPI - select_related & prefetch_related

2021. 11. 10. 11:58언어/Python

반응형

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_relatedprefetch_related를 사용하지 않았을 때 실행되는 쿼리의 수

    72

  • select_related를 사용했을 때 실행되는 쿼리의 수

    58

  • select_relatedprefetch_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
반응형