주인 : 강아지
1 : N
현재 데이터베이스에는 이렇게 되어 있고 "태훈"이와 태훈이의 강아지 3마리 바둑이, 멍멍이, 백구로 해보자
In [26]: dog1 = Dogs.objects.get(id=6)
In [27]: print(dog1)
Dogs object (6)
In [28]: print(dog1.name)
백구
In [29]: print(dog1.age)
13
In [30]: print(dog1.owner_id)
3
# owner_id는 원래 models.py에서 owner였지만
# FK속성으로 인해 자동으로 _id가 붙은 것
In [32]: dog1.owner.name
Out[32]: '태훈'
In [33]: dog1.owner.email
Out[33]: 'taehoon@gmail.com'
In [34]: dog1.owner.age
Out[34]: 30
하지만 반대로 Owners는 Dogs를 역참조 하고 있으므로 바로 접근이 불가능하다. "태훈"이라는 주인을 가지고 있는 모든 강아지를 불러와보자
In [41]: owner1=Owners.objects.get(name="태훈")
In [42]: print(owner1)
Owners object (3)
Owners object (3)
DB 테이블의 3번 id 인스턴스라는 것owner1.dogs.all()
이렇게 바로 불러와버리면 오류가 난다[classname]_set
이라는 속성을 통해 접근할 수 있다[classname]_set
대신 사용할 수 있는 것이 related_name
이다. 역참조 대상인 Owners 객체를 부를 이름. Owners 클래스를 정의할 때 정참조 하고 있는 Dogs 클래스의 인스턴스에서 어떤 명칭으로 거꾸로 호출 당할지 정해주는 이름인 것이다related_name
속성을 이미 준 경우에는 _set
속성으로 불러올 시 AtrributeError
가 난다모든 Foreign Key에 related_name을 붙여줄 필요는 없다. 때에 따라, 참조하고 있는 객체 이름에 _set을 붙이는 것이 더 직관적인 경우가 굉장히 많기 때문이다.
related_name
이 필수인 경우 -> 정참조 하는 속성이 2개 일 경우! 설명 너무 잘해놓으신 위코드 멘토님의 블로그 참고