본문 바로가기
Programming/Django

📘 Django ORM 이해하기 – 역참조란 무엇인가?

by Mandy's 2025. 7. 23.

Django에서 모델 간의 관계를 설정할 때, 우리는 종종 ForeignKey나 ManyToManyField, OneToOneField 등을 사용하게 됩니다. 이 과정에서 함께 등장하는 개념이 바로 역참조 (Reverse Relation) 입니다.

이번 글에서는 Django ORM에서의 역참조란 무엇인지, 그리고 실제 코드에서는 어떻게 사용하는지를 자세히 정리해보겠습니다.

 


 

🔁 역참조란?

쉽게 말해 “어떤 객체가 다른 모델로부터 참조될 때, 그 참조된 쪽에서 참조한 객체들을 다시 조회하는 것” 을 의미합니다.

예를 들어, 아래와 같이 Post 모델이 Author 모델을 참조하고 있는 구조를 생각해봅시다.

class Author(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True, related_name="posts")

이제 Post는 author 필드를 통해 Author를 정참조할 수 있고, 반대로 Author는 related_name="posts" 덕분에 자신을 참조하는 모든 Post 객체를 역참조할 수 있습니다.

 


 

🧪 실제 사용 예시

author = Author.objects.get(name="민주")
posts_by_author = author.posts.all()

위 코드에서 author.posts는 Post 모델에 있는 author = ForeignKey(...) 에서 설정한 related_name="posts" 덕분에 만들어진 역참조입니다.

즉, 해당 작가가 작성한 모든 포스트를 불러오는 쿼리입니다.

 


 

🧠 related_name이 중요한 이유

만약 related_name을 생략한다면, Django는 기본으로 post_set이라는 이름을 부여합니다.

# related_name을 지정하지 않은 경우
author = Author.objects.get(id=1)
author.post_set.all()

이처럼 related_name을 지정하면 훨씬 의미 있는 이름으로 참조가 가능해지고, 가독성이 올라갑니다.

 


 

🔒 참고: related_name="+" 의 의미

author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="+")

이렇게 related_name에 "+"를 지정하면 역참조를 아예 차단합니다. 즉, Author 입장에서 author.posts 같은 역참조 접근 자체가 막히게 됩니다. 특수한 경우에만 사용합니다.

 


 

🧾 마무리 정리

설정 예시 역참조 이름

related_name="posts" author.posts.all()
지정하지 않음 author.post_set.all()
related_name="+" 역참조 불가능

다음 글에서는 ManyToManyField와 OneToOneField에서의 역참조에 대해서도 다뤄보겠습니다.
궁금한 점이나 요청이 있다면 댓글로 남겨주세요!