[Django] prefetch_related

hukim·2020년 11월 11일
0

Django

목록 보기
11/12

이전 포스팅에서 select_related에 대해서 다뤘습니다.

이번에는 prefetch_related에 대해서 다뤄보겠습니다.
prefetch_related는 구하려는 객체가 정참조 multiple objects(many-to-many, one-to-many)이거나 역참조 Foreign Key일때 사용합니다.
또한 one-to-one, Foreign key 등 모든 relationship에서 사용 가능합니다.

class City(models.Model):
	name = models.CharField(max_length = 50)

class District(models.Model):
	name = models.CharField(max_length = 50)
    	city = models.ForeignKey(City, on_delete = models.CASCADE)

위와 같은 모델이 있다고 가정해보겠습니다.

city테이블을 기준으로 city를 참조하는 district객체들을 전부 찾아야 하는 쿼리를 작성할 때

City.objects.prefetch_related('district_set').all()[2].district_set.all()

city테이블에서 id가 3인 객체를 참조하는 district객체들을 전부 가져왔습니다.

prefetch_related를 사용하면 select_related와는 반대로 역참조 관계 (위의 모델에서는 city를 통해 district의 정보를 참조하고 싶을 때) 유용하게 사용됩니다.

ORM의 필터 조건에 따라서 select_related보다 prefetch_related가 유리할 때도 있습니다.

prefetch_related는 모든 relationship에서 사용할 수 있고 굳이 select_related를 사용해야되는지 의문이 생길 수도 있지만

select_related와 차이점이 있다면 prefetch_related는 JOIN을 하지 않고 개별 쿼리를 실행한 후, django에서 직접 데이터 조합을 합니다.

그렇기 때문에 쿼리를 두 번 수행하게 됩니다.

SQL Logger 등을 활용하여 어떻게 하면 DB에 접근하는 것을 최소로 할 수 있을것인지에 대해 항상 고민하면서 코드를 작성해야 할 것 입니다.

0개의 댓글