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는 반대로 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()