# models.py
class Allergy(models.Model):
name = models.CharField(max_length=45)
class Drink(models.Model):
korean_name = models.CharField(max_length=45)
english_name = models.CharField(max_length=45)
description = models.TextField()
category = models.ForeignKey('Category', on_delete=models.CASCADE)
#allergies = models.ManyToManyField(Allergy, through = "AllergyDrink")
class AllergyDrink(models.Model):
allergy = models.ForeignKey('Allergy',on_delete=models.CASCADE)
drink = models.ForeignKey('Drink',on_delete=models.CASCADE)
중간 테이블 AllergyDrink를 만들어주고 Allergy와 Drink를 FK로 연결해줘도 사실 데이터를 읽고 가져오는데에는 문제가 없다. 근데 굳이 many to many 로 관계설정을 해주는 이유는 뭘까?
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)>
중간테이블인(AllergyDrink를 통해 drink에 allergy 정보를 넣어준 모습)
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]: '견과류'
MTM 관계설정을 안해줬을 경우, Drink의 Allergy 정보를 가져올때 이렇게 중간 테이블 거쳐야 가져올 수 있다.
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]: '견과류'
Drink의 Allergy 정보를 가져올때 MTM 관계 설정을 해줬기 때문에 간단하게 allergy 정보를 가져올 수 있다.
Many To Many관계를 넣어줄때 장점은 중간테이블을 거치지 않고 언제든지 데이터를 쉽게 추가하고 가져올 수 있다는 장점이 있다.
<최소한의 데이터베이스를 거쳐서 가져오는것이 가장 좋다!>
잘보고 갑니다!