ForeignKey와 정참조와 역참조
FK를 가진 클래스에서 가지지 않는 클래스를 참조할 때는 정참조
FK를 가지지 않은 클래스에서 가진 클래스를 참조할 때는 역참조
ForeignKey를 가진 child는 lookup(__)을 사용하여, parent의 필드를 참조할 수 있다.
parent도 같은 방법으로 자신의 child의 필드를 참조할 수 있다.
select_related 와 prefetch_related를 사용한 데이터 참조
select_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
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 |