Django ManyToMany

토닉·2021년 5월 2일
0

Django

목록 보기
4/6

모델간의 데이터가 서로 다대다 관계일 때 ManyToMany를 사용합니다.

예시

스타벅스 음료와 알레르기 관계


한 음료에 알레르기를 유발하는 성분이 여러개 있을 수 있고 알레르기를 유발하는 성분 하나가 여러 음료에 있을 수 있습니다. 이런 상황일 때 ManyToMany를 사용하게 됩니다.

직접 중간 테이블 만들기

위 테이블 구조처럼 외래키(foreignKey)로 연결해서 만들 수 있습니다.

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "products"

class Allergy(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "allergies"

class ProductAllergy(models.Model):
    product = models.ForeignKey(Product, on_delete = models.CASCADE)
    allergy = models.ForeignKey(Allergy, on_delete = models.CASCADE)
    
    class Meta:
        db_table = "products_allergies"

직접 중간 테이블인 ProductAllergy 를 만들고 외래키로 양쪽 테이블에 연결하면 됩니다.

ManyToManyField로 만들기

두 모델중 하나에 ManyToMany를 사용하면 됩니다.

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length = 45)
    allergy = models.ManyToManyField(Allergy, through = 'ProductAllergy')
    
    class Meta:
        db_table = "products"
    
class Allergy(models.Model):
    name = models.CharField(max_length = 45)
    
    class Meta:
        db_table = "allergies"

class ProductAllergy(models.Model):
    product = models.ForeignKey("Product", on_delete = models.CASCADE)
    allergy = models.ForeignKey("Allergy", on_delete = models.CASCADE)
    
    class Meta:
        db_table = "products_allergies"

위에서는 through를 통해 중간테이블을 만들어줬지만
굳이 안만들어도 자동으로 중간 테이블이 생성됩니다.
중간 테이블의 이름은 두 테이블이름을 따서 products_allergies로 생성됩니다.

이 둘의 차이는 무엇인가요?

큰 차이점은 쿼리문으로 테이블에 접근하는 방법입니다. ManyToMany 를 사용하면 중간테이블에 접근하지 않고도 안에 데이터를 가져올 수 있습니다.

카페라떼의 알레르기를 알고 싶을 때

cafelatte = Product.objects.get(name='카페라떼')
cafelatte.allergy.all()

우유 알레르기가 있는 음료를 알고 싶을 때

milk = Allergy.objects.get(name = '우유')
milk.product_set.all() # 역참조일 때는 set을 붙인다.
profile
우아한테크코스 4기 교육생

0개의 댓글