TIL-50 Related Name, Reverse Relation

이동근·2021년 2월 14일
0

django

목록 보기
12/12

정참조와 역참조

DB에서 두 테이블이 서로 참조 관계에 있으면 서로를 참조해서 데이터를 찾을 수 있다.
Aquery로 엮인 두 테이블은 서로 정참조로 찾을 수 있다.

Category테이블이 Menu테이블에 참조가 걸려있다.

그리고 DB에 데이터도 들어가 있는 상태 이다.

정참조 Category -> Menu 로 가는 것을 의미한다.

Category.objects.get(id=1)
>>><Category: 콜드브루>
b = Category.objects.get(id=1)
b.menu
>>> <Menu: 음료>

이렇게 진행되는 것이 정참조 이다.

b 객체를 통해 Menu로 정참조를 가능하게 하고, menu_id와 같이 다른 column의 데이터를 가져 올 수 도 있다.

역참조 Menu->Category로 가는 것을 의미한다.
Menu에서 Category를 바라보게 되면 어떤 데이터가 연결되어 있는지 모르기 때문에 참조가 안될 것이다. 하지만!!! 가능하다.

Menu.objects.get(id=1)
>>><Menu: 음료>
a = Menu.objects.get(id=1)
a.category_set.all()
>>><QuerySet [<Category: 콜드브루>, <Category: 브루드커피>......]>

이런식으로 category_set() 을 이용해서 역참조를 할 수 있다

.all()은 queryset으로 모든 데이터를 리스트 형식으로 불러온다. 거기서 원하는 데이터를 [0],[1] 이런식으로 불러올 수 있따.

위에서 보였던 category_set 대신에 사용할 수 있는 것이 'related name' 이다.

이런식으로 Categories에 'related_name='categories''를 추가시켰다.
그 후 shell에서 참조를 보면

Menu.objects.get(id=1)
>>><Menu: 음료>
a = Menu.objects.get(id=1)
a.categories.all()
>>><QuerySet [<Category: 콜드브루>, <Category: 브루드커피>......]>

똑같은 결과를 얻을 수 있다.


이런식으로 가능하다.

선택적 사용 대신에 반드시 Related Name을 사용해야 할 경우가 있다.
한 클래스에서 서로 다른 두 컬럼이 같은 테이블을 참조하는 경우이다.

이렇게 Follow테이블에서 'follower' 컬럼과, 'followee' 컬럼이 'User' 테이블을 정참조를 같이 하고 있다.

만약 related name을 설정해 주지 않았다면?

애초에 migration이 이루어지지 않고 relatedname을 설정하라는 오류문이 나온다. 빨갛게...

User테이블을 정참조하는 컬럼이 두 개이기 때문에 User_set으로 역참조시에 어떤 것을 가져와야 될지 djangoshell이 알지를 못한다 그래서 relatedname으로 이름표를 붙혀 주는 것이다.


이제 1차 프로젝트가 들어가는데, 데이터 관계설정 부터 지난 한달간 배웠던 모든 것 뿐만 아니라 그 이상으로 쏟아 부어야 한다.

1차 프로젝트 목표!! - 최대한 Restful 하게 코드를 짜보자!!!

profile
하루하루 1cm 자라는 개발자

0개의 댓글