Django Models 4 ManyToMany

다 대다 (ManyToMany relationships)

서로 여러개의 관계를 가지는 형태. A모델이 B모델을 가질 수 있고 B모델도 A모델을 여러개 가질 수 있는 것.

many-to-many관계를 정의 하려면 ManyToManyField를 사용한다.

다른 필드 와 마찬가지로 모델의 클래스 속성으로 포함하여 사용 한다. 그리고 다 대다 관계도 재귀관계를 만들 수 있다.

예를 들면 어떤 글의 좋아요를 누르게 되면 해당 글에 어떤 사람이 좋아요를 눌렀는지 가지고 그 사람은 여러 글에 좋아요를 할 수 있다.

피자는 여러 종류의 토핑을 가질 수 있다. 토핑은 여러 종류의 피자에 올라 갈 수 있다.

일반적인 다 대다 관계를 처리할 경우 ManyToManyField만 있으면 된다.

그리고 MTM의 이름은 관련 모델 객체 세트를 설명하는 복수형으로 제안되지만 필수는 아니다.

MTM필드가 어디에 있는지는 중요하지 않지만 두 모델중 하나에만 있어야 한다. 어느 쪽이 주가 되는 의미인지에 따라 주가되는 모델에 필드를 정의 하는게 좋다.

from django.db import models


class Topping(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

    def __str__(self):
        return self.name
masterPizza = Pizza.objects.get(name='마스터피자')
masterPizza.toppings.all()
# 치즈, 피망, 불고기, 파인애플...
cheeseTopping = Topping.objects.get(name='치즈')
cheeseTopping.pizza_set.all()
# 치즈피자, 하와이안피자, 불고기피자...

이렇게 생성한 테이블중 다 대다 관계를 표한하는 테이블이 새로 생성되는데 여기는 3개의 필드가 존재 한다. id필드 pizza_id, topping_id 각각 Rowpk, 피자의 pk, 토핑의 pk 다른 모델의 인스턴스의 pk값만으로 서로의 관계를 연결 하고 있다.

이렇게 단순한 관계일 경우는 일반적인 ManyToManyField로 끝나지만 만약 두 모델간의 관계에 데이터를 연결해야 할 경우가 생길 수도 있다.

이런 경우에는 중계 테이블을 만들어 ManyToManyField를 만들어서 사용 해야 한다.

Comments