이전 포스팅에서 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에 접근하는 것을 최소로 할 수 있을것인지에 대해 항상 고민하면서 코드를 작성해야 할 것 입니다.