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" 속성 부여 필수
    -> 관련된 질문과 멘토님의 답변 :

좋은 웹페이지 즐겨찾기