Select/Prefetch_related

이산·2022년 4월 3일
0

기술블로그

목록 보기
17/42

select_relaed와 prefetch_related는 쿼리셋을 가져올 때, 관련된 objects까지 불러올 수 있는 함수이다. DB에 접근하는 횟수를 줄여주므로 성능 향상도 기대할 수 있다.

foreign key에서 정참조 이거나, 역참조하는 single object(one-to-one or many-to-one)일 경우에 사용한다.
각각의 lookup마다 SQL의JOIN을 실행하여 테이블의 일부를 가져오고, select .. from에서 관련된 필드들을 가져온다.

형식
parameter에는 참조하는 class의 이름을 소문자로 쓰고 ' '으로 감싼다. 여러개의 parameter를 참조할 수 있다.

Store.objects.filter(id=1).select_related('gungu','city').values('id','name','city_name')
@ manage.py shell
>>> from drink.models import *

# select_related를 사용하지 않은 경우 
>>> drink = Drink.objects.get(id=1) 🎯                                [1]
>>> drink
<Drink: dolce cold brew>
>>> SubCategory.objects.filter(id=drink.sub_category_id)              [2]
<QuerySet [<SubCategory: cold brew>]>
>>> SubCategory.objects.filter(id=drink.sub_category_id)[0] 🎯        [3]
<SubCategory: cold brew> 
>>> SubCategory.objects.filter(id=drink1.sub_category_id)[0].name 🎯  [4]
'cold brew'

# selected_related를 사용한 경우
>>> drink_sr = Drink.objects.select_related('sub_category').get(id=1) 🎯   [a]
>>> drink_sr
<Drink: dolce cold brew>
>>> drink_sr.sub_category.name                                               [b]
'cold brew'

Drink라는 객체를 지정할 때, 이미 관계되는 정보드를 불러왔기 때문에 DB를 자주 사용하지 않는다.

Prefetch_related

역참조 Foreign_key 이거나 정참조 multiple objects(many-to-many or one-to-many)일 경우에 사용한다. prefetch_related는 SQL Join을 실행하지 않고 python에서 Join을 실행한다.

형식

class Profile(models.Model):
    drink = models.ForeignKey('Drink', related_name='drinks')
    
drink2 = SubCategory.objects.filter(id=1).prefetch_related("drink_set")
>>> drink2 = SubCategory.objects.filter(id=1).prefetch_related("drink_set")      
<QuerySet [<SubCategory: cold brew>]>

>>> drink2[0]                               					 
<SubCategory: cold brew>

>>> drink2[0].drink_set.filter(id=1)						 
<QuerySet [<Drink: dolce cold brew>]>

>>> drink2[0].drink_set.get(id=1).name_en					
'dolce cold brew'
profile
백엔드 개발자입니다.

0개의 댓글