Drink와 Allergy를 Many to Many로 연결해준 경우에는 굳이 중간 테이블은 AllergyDrink를 거치지 않고 Drink를 통해 바로 Allergy를 추가해 줄 수 있다.(add를 통해서)
근데 만약 Drink와 Allergy를 MTM으로 연결해주지 않고 중간테이블(AllergyDrink)를 FK(Drink, Allergy)로만 연결해주면 데이터 추가할때 항상 중간테이블을 거쳐야한다. 예시를 통해 알아보자.
<중간테이블을 연결하고 MTM연결을 안한 경우>
In [3]: Allergy.objects.create(name='견과류')
Out[3]: <Allergy: Allergy object (6)>
In [4]: c2 = Category.objects.get(id=2)
In [6]: Drink.objects.create(korean_name='오곡 라떼', category=c2)
Out[6]: <Drink: Drink object (3)>
In [7]: d3 = Drink.objects.get(id=3)
In [8]: a6 = Allergy.objects.get(id=6)
In [9]: AllergyDrink.objects.create(allergy=a6, drink=d3)
Out[9]: <AllergyDrink: AllergyDrink object (6)>
<MTM 연결한 경우>
In [6]: Allergy.objects.create(name='견과류')
Out[6]: <Allergy: Allergy object (8)>
In [35]: a8 = Allergy.objects.get(id=8)
In [36]: c2 = Category.objects.get(id=2)
In [37]: d3 = Drink(korean_name='오곡라떼', category=c2)
In [38]: d3.save()
In [39]: d3.allergies.add(a8)
Drink를 통해 바로 allergy 정보를 넣어 줄 수 있다.
위 아래 비교해서 그림 참조!
In [23]: d3 = Drink.objects.get(id=3)
In [24]: d3.allergydrink_set.all()
Out[24]: <QuerySet [<AllergyDrink: AllergyDrink object (6)>]>
In [25]: d3.allergydrink_set.get()
Out[25]: <AllergyDrink: AllergyDrink object (6)>
In [26]: d3.allergydrink_set.get().allergy
Out[26]: <Allergy: Allergy object (6)>
In [27]: d3.allergydrink_set.get().allergy.name
Out[27]: '견과류'
In [40]: d20 = Drink.objects.get(id=20)
In [41]: d20.allergies.get()
Out[41]: <Allergy: Allergy object (8)>
In [42]: d20.allergies.get().name
Out[42]: '견과류'
Many To Many관계를 넣어줄때 장점은 중간테이블을 거치지 않고 언제든지 데이터를 쉽게 추가하고 가져올 수 있다는 장점이 있다.
<최소한의 데이터베이스를 거쳐서 가져오는것이 가장 좋다!>