MantToMany field인 Drink 필드와 Allergy 필드! 이 두 필드를 ManyToMany로 연결할 수 있지만 연결하는 테이블을 만들어 ForeignKey로 Drink와 Allergy를 선언하는 방법도 있는데요~ 오늘은 이 두 테이블 사이에 징검다리 역할을 하는 테이블을 어떻게 만들고 연결하는지 알아보겠습니다.
위의 ORM을 보면 drink와 allergy는 ManyToMany 관계로 중간에 allergy_drink라는 테이블이 이 둘을 연결하고 있는데요! 이를 연결하기 위해서는 through
를 입력해 MantToMany field가 사용할 model을 지정해줍니다.
class Drink(models.Model):
category = models.ForeignKey(
"Category", related_name="drinks", on_delete=models.CASCADE, null=True
)
korean_name = models.CharField(max_length=45)
english_name = models.CharField(max_length=45)
description = models.TextField(max_length=300)
class Meta:
db_table = "drinks" # DB에 표시되고 사용할 테이블 명
class Allergy(models.Model):
name = models.CharField(max_length=45)
drinks = models.ManyToManyField(
Drink, related_name="allergies", through="AllergyDrink"
)
class Meta:
db_table = "allergies"
class AllergyDrink(models.Model): # 두 모델을 연결하는 테이블
allergy = models.ForeignKey(
"Allergy", related_name="allergydrinks", on_delete=models.CASCADE, null=True
)
drink = models.ForeignKey(
"Drink", related_name="allergydrinks", on_delete=models.CASCADE, null=True
)
class Meta:
db_table = "allergy_drinks"
db_table
에 들어갈 테이블은 django에서 자동으로 생성한 table이름으로 해주고 이를 사용해야 해서 직접 지정해주었습니다. class Meta
는 class안의 class라고 생각하면 편하며 ordering, verbose_name_plural 등 옵션들을 선택해줄 수 있습니다.
확장 후(model을 수정한 후)에는 항상 migrate를 해 데이터베이스에 반영하도록 합니다. 꼭!