본문 바로가기

Python/Django

Python Django: symmetrical option in ManyToMany # ManyToMany에서 한쪽만 관계 설정 # 테이블 자신을 참조하는 경우

728x90
반응형

Django에서 ManyToMany를 통해 Table을 연결하면,

예를 들어 A, B 테이블을 ManyToMany를 통해 연결시

A에서 B를 연결할 경우, B에서 A 방향으로도 자동 연결

 

그러나 A -> B를 연결 하더라도, B -> A로 자동연결이 되는 것을 원치 않는 상황도 존재

예를 들어

A 의 row에 대한 추천 상품으로 B의 row 들을 지정한다고 해보자.

그러나 B의 row에 대한 추천 상품은 A가 아닌 C를 지정하길 원한다고 하면,

기존 ManyToMany 방식으로 B의 추천상품을 불러올 시 A가 함께 가져와진다.

 

이는 ManyToMany의 기본 옵션이 상호  대칭적인 symmetrical = True 이기 때문

따라서 ManyToMany설정시 symmetrical = False 옵션으로 주면, A -> B, B -> C (B -> A가 안걸리도록)와 같은 형태로

연결 가능

 

이 옵션을 사용할 경우, 역참조를 어떻게 할것인지를 반드시 정해줘야 한다.

=> related_name 설정을 통해 B -> A  방향의 연결을 불러올 수 있다.

 

* 참조할 테이블을 자기 자신으로 하는 경우 예시 ('self')

recommended_item = models.ManyToManyField('self', symmetrical=False, related_name='inversed_item')
728x90
반응형