본문 바로가기
First step/web depeloper step1

select, prefetch related

by Joshua21 2021. 12. 8.

ForeignKey와 정참조와 역참조

FK를 가진 클래스에서 가지지 않는 클래스를 참조할 때는 정참조

FK를 가지지 않은 클래스에서 가진 클래스를 참조할 때는 역참조

ForeignKey를 가진 child는 lookup(__)을 사용하여, parent의 필드를 참조할 수 있다.

parent도 같은 방법으로 자신의 child의 필드를 참조할 수 있다.

 

select_related 와 prefetch_related를 사용한 데이터 참조

Selected_related는 SQL Query 문의 JOIN 을 사용하여 foreign-key(one to one, many to one)를 사용하여 정참조할 때 사용하며 QuerySet을 가져올 때, 미리 related objects까지 불러오는 함수이다.

비록 쿼리는 복잡해지지만 불러온 data들은 데이터베이스 서버가 종료되기 전 까지 Cache에 남게되어 매 쿼리마다 DB에 접근하지 않아도 된다. 

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

parameter에는 참조하는 class의 이름을 소문자로 쓰고 ' '에 감싼다. 여러개의 parameter를 가질 수 있다.
예) Store.objects.filter(id=1).select_related('gungu','city').values('id','name','city_name')

prefetch_related는 selected_related와 같이 data를 Cache에 저장하며, 모든 relationships에서 사용이 가능하다.
Selected_related는 하나의 Query로 related Objects들을 불러오지만, Prefetch_related는 main query가 실행이 된 후 별도의 query가 실행이 된다. 따라서 1번 이상 쿼리가 진행되기 때문에 가급적 selected_related를 사용하는 것이 리소스 소모를 줄일 수 있다,

구하려는 객체가 정참조 multiple objects(many-to-many or one-to-many)이거나, 또는 역참조 Foreign Key일때 사용한다.selected_related와 달리, prefetch_related는 SQL의 JOIN을 실행하지 않고, python에서 joining을 실행한다.

prefetch_related 은 원래의 main query가 실행된 후 별도의 query를 따로 실행하게 된다. 반면, select_related 은 하나의 query만으로 related objects들을 다 가져온다.
즉, 완벽히 동일한 결과라도 prefetch_related 를 쓰느냐, select_related 를 쓰느냐에 따라 query의 수가 달라진다.

 

'First step > web depeloper step1' 카테고리의 다른 글

역참조 ,join 이해해보기  (0) 2021.12.17
Unit Test  (0) 2021.12.15
Dr Jart 클론 프로젝트 간 새롭게 사용한 것  (0) 2021.12.07
RESTful API  (0) 2021.12.03
csv파일로 database에 입력하기  (0) 2021.12.02