[Django]select_related & prefetch_related

Jinsung·2021년 12월 3일
0

select_related(*fields(컬럼))

ForeignKey관계에서 사용할 수 있으며 mysql에 비교하면 left join에 가까운 편입니다.

정참조에는 ForeignKey를, 역참조에는 OneToOneField를 사용합니다.
단, OneToOneField의 경우 특정 컬럼명을 명시해야 하며, models.py에서
related_name을 사용해야 한다고 합니다.

select_related는 내가 가져올 모델과 *fields안의 테이블 or 테이블의 컬럼을
JOIN하여 교집합인 부분을 가져옵니다.

만약 select_related를 여러번 쓰고 싶다면, 두 가지 방법으로 표기 가능합니다.

1. select_related('class1', 'class2'),
2. select_related('class1').select_related('class2')

prefetch_related(*look_ups)

prefetch_related는 반대로 1:N의 관계에서 1이 사용할 수 있고, M:N의 관계에서 사용할 수 있다. 즉, 역방향 참조(Category 모델에서 Post 모델의 정보를 찾으려고 할 때)에 유리하게 사용된다.
select_related랑 다른점은 추가쿼리가 발생하다는 것이다.(2중쿼리)

정참조
prefetch_related('class1')
역참조
prefetch_related('class1_set')
2중쿼리(class1에 id=1에 포함된 class2의 값을 정렬한다)
class1.objects.prefetch_related('class2').get(id=1).class2.values()

0개의 댓글