다대다 관계(ManyToMany)는 일대일이나 일대다 보다 매우 복잡한 관계 모델로 테이블 A 의 모델은 테이블 B 의 여러 개의 모델과 관계되어질 수 있으며 테이블 B 의 모델도 테이블 A 의 여러 개의 모델과 관계될 수 있습니다.
1) 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)>
2) 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)
1) MTM 연결 안해준 경우
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]: '견과류'
2) MTM 연결해준 경우
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]: '견과류'