📍ManyToManyField
자동으로 중간 테이블을 설정
정참조와 역참조 객체 호출
- 정참조의 경우 : 속성으로 접근
- 역참조의 경우 : _set 또는 related_name 으로 접근
class Drink(models.Model):
korean_name = models.CharField(max_length=45)
english_name = models.CharField(max_length=45)
description = models.TextField(blank=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
class Meta:
db_table='drinks'
class Allergy_drink(models.Model): #다대다 연결할 중간테이블의 클래스 생성
allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
class Meta:
db_table='allergies_drinks'
class Allergy(models.Model):
name = models.CharField(max_length=45)
class Meta:
db_table='allergies'
from django.db import models
# Create your models here.
class Menu(models.Model):
name = models.CharField(max_length=45)
class Meta:
db_table='menus'
class Category(models.Model):
type = models.CharField(max_length=45)
menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
class Meta:
db_table='categories'
class Drink(models.Model):
korean_name = models.CharField(max_length=45)
english_name = models.CharField(max_length=45)
description = models.TextField(blank=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
allergies = models.ManyToManyField("Allergy") #ManyToManyField()사용
class Meta:
db_table='drinks'
#ManyToManyField()사용했기 때문에 별도의 중간테이블 생성을 위한 클래스만들 필요X
class Allergy(models.Model):
name = models.CharField(max_length=45)
class Meta:
db_table='allergies'
위 두가지 방법 모두 결과는 아래와 같다.
ManyToManyField()
사용하면 별도의 중간테이블을 만들지 않아도 자동으로
allergies_drinks
라는 테이블이 생성되고 자동으로 외래키를 받는다
👉 테이블명으로 직접 지정하고 싶다면
allergies = models.ManyToManyField("Allergy",db_table=allergy_drink"")
1번 방법으로 다대다 연결을 할 때에는 데이터를 가져올 때 allergies.all()
하면 되지만
2번 방법으로 다대다 연결을 할 때에는 AttributeError
가 발생한다
allergies_set.all()
으로 사용해야한다.