이미 게시 된 답변을 살펴 보았습니다. 실제 예제로 답변을 추가하면 더 좋을 것이라고 생각했습니다.
관련있는 장고 모델이 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 관련 M3
ID를 가진 개체를 1,2,3,4,5
. M3
각 객체에 대해 연결된 객체를 가져올 때 M2
select related을 사용하면 이것이 작동하는 방식입니다.
단계 :
m21
물체를 찾으십시오 .
- ID가 인
M3
객체와 관련된 모든 객체를 쿼리합니다 .m21
1,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
개체를 한 번만 쿼리하여 성능을 향상시킬 수 있습니다.