ManyToManyField & Junction Table
Junction table
- ManyToMany(MtoM), 다대다 관계로 이루어진 DB 테이블
- 1대다 와 다대1 테이블의 중간기점
1. Junction table 을 이용한 view.py
Q. 배우의 풀네임과 출연한 영화 목록 Get 으로 출력
A.
class ActorsView(View): def get(self, request): actors = Actor.objects.all() results = [] for actors_data in actors: actor_id = MovieActor.objects.filter(actor=actors_data) results.append( { "이름" : actors_data.first_name, "성" : actors_data.last_name, "영화리스트" : [movie_id.movie.title for movie_id in actor_id] } ) return JsonResponse({'results':results}, status=200)
-> Foriegn Key만 존재하는 Junction table이 참조하고 있는 다른 PK table의 데이터를 가져와 변환하는 방법이 주요 포인트
-> Actor의 PK를 참조하고 있는 Movie의 FK를 찾기 위해, "영화리스트" 항목에 Actor_id 값 들을 가진 리스트로 for문을 사용하여 Movie_id 값을 추출 하는 방식
2. ManyToManyField 를 이용한 view.py(models.py 선 수정)
Q. 영화의 데이터들과 해당 영화에 출연한 배우들 목록 Get
A.
class MoviesView(View): def get(self,request): movies = Movie.objects.all() results = [] for movie_data in movies: results.append( { "영화제목" : movie_data.title, "개봉날짜" : movie_data.release_date, "러닝타임" : movie_data.running_time, "배우목록" : [actor_data.last_name for actor_data in movie_data.actors_set.all()] } ) return JsonResponse({"result":results}, status = 201)
-> Models.py 에서 ManyToManyField 를 추가할 때, 어디에 있는지는 중요하지 않지만, 두 모델중 한 곳에만 있어야함을 주의해야 함
Review
-
Junction table 을 사용하면 MtoM Field 를 사용한 것보다 views에서의 데이터 추출이 조금 더 복잡해지는 것 같음
-
MtoM Field 를 사용하면 DB에 데이터를 입력할 때, 일부러 junction table 을 생성하고, 데이터를 입력할 수고가 줄어듦
-
하지만 이렇게 단순한 관계일 경우는 일반적인 MtoM field로 끝나지만, 만일 두 모델간의 관계에 추가적인 데이터를 연결해야 할 경우가 생겼을 시, junction table을 포함해 MtoM Field도 만들어야 함
-> 이와 관련된 질문과 멘토님의 답변 : -
MtoM Field 와 junction table 동시 사용 시 "through" 속성 부여 필수
-> 관련된 질문과 멘토님의 답변 :
Author And Source
이 문제에 관하여(ManyToManyField & Junction Table), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@_ted_0527_/Get-Data-through-Junction-tableMtoM저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)