Django ManyToMany
모델간의 데이터가 서로 다대다 관계일 때 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을 붙인다.
Author And Source
이 문제에 관하여(Django ManyToMany), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tonic523/Django-ManyToMany저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)