이미 게시 된 답변을 살펴 보았습니다. 실제 예제로 답변을 추가하면 더 좋을 것이라고 생각했습니다.
관련있는 장고 모델이 3 개 있다고 가정 해 봅시다.
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
여기에서 조회 할 수 있습니다 M2모델과 상대 M1사용하여 객체 select_relation필드 및 M3사용하여 객체 prefetch_relation필드.
우리가 언급 한 그러나 같은 M1에서의 관계 M2입니다 ForeignKey, 그냥만을 반환 한 모든 녹음 M2개체를. 같은 것도 적용됩니다 OneToOneField.
그러나 M3의 관계 M2는 ManyToManyField많은 수의 M1객체를 반환 할 수 있습니다.
당신이이 경우 고려 M2객체 m21, m22같은이 5 관련 M3ID를 가진 개체를 1,2,3,4,5. M3각 객체에 대해 연결된 객체를 가져올 때 M2select related을 사용하면 이것이 작동하는 방식입니다.
단계 :
m21물체를 찾으십시오 .
- ID가 인
M3객체와 관련된 모든 객체를 쿼리합니다 .m211,2,3,4,5
m22객체와 다른 모든 객체에 대해 동일한 것을 반복하십시오 M2.
우리가 같은 것처럼 1,2,3,4,5모두에 대해 ID를 m21, m22우리는 옵션을 select_related 사용하는 경우, 이미 인출 된 것과 동일한 ID에 대해 두 번 DB를 쿼리 것, 객체.
대신 prefetch_related를 사용하면 M2객체 를 가져올 때 M2테이블 을 쿼리하는 동안 객체가 반환 한 모든 ID (참고 : ID 만)를 기록하고 마지막 단계에서 Django는 M3테이블에 쿼리 합니다. M2객체가 반환 한 모든 ID 세트와 함께 . 과에 가입 M2데이터베이스 대신 파이썬을 사용하여 객체.
이렇게하면 모든 M3개체를 한 번만 쿼리하여 성능을 향상시킬 수 있습니다.