related_name 설정 시 prefetch_related 사용 방법

related_name 설정 시 prefetch_related 사용 방법

2018, Dec 25    

오늘은 저처럼 실수하시는 분이 없기 위하여 글을 써보려고 합니다.

장고 model 에서 ForeignKey를 사용 할 때, 특히 한 모델에서 여러 개의 ForeignKey가 있을 때, related_name을 이용하여 ForeignKey의 이름을 정할 수 있습니다.

예를 들어 모델 A의 pk를 모델 B가 FK로 사용하고 있다고 가정합시다. 장고는 lazy 하게 SQL 작업을 수행하므로 ForeignKey로 접근한 데이터에 대한 작업이 여러번 생긴다면, 즉, join 연산이 필요하다면, prefetch_related를 통하여 필요한 query를 바로 가져와서 작업하는 것이 효율적 입니다.

이 때, prefetch_related는 다음과 같이 사용할 수 있습니다.

A.objects.prefetch_related("B_set")


즉, A 모델이 B 모델의 FK를 통하여 join 한 결과 값을 lazy하지 않게 한번에 가져올 때 사용합니다. prefetch_ralated 내용은 제 블로그의 다른 글에서 확인해 보시면 되겠습니다.

이 때 중요한 것은 related_name을 이용한 경우 model_set 형태가 아니라 related_name 자체를 입력해 주면 되겠습니다.

예를 들면 아래와 같습니다.

class Price(models.Model):
    book = models.ForeignKey(Book, related_name='prices')
    
books = Book.objects.prefetch_related('prices')


다시 하면 정리하면 related_name을 사용한 경우 prefetch_related를 사용할 때, foo_set을 파라미터로 사용하지 않고 related_name을 바로 사용하면 됩니다.

도움이 되셨다면 광고 클릭해주시면 큰 도움이 되겠습니다. 꾸벅