many to many
로 연결one to many
로 연결짚고 넘어갈 개념
ForeignKey --> one to many 의미
OneToOneField --> one to one 의미
ManyToManyField --> Many to Many 의미
Django-DB 연습 #1
에 만들었던 wediya 로 계속 진행! 🍎 🍊 🍋 🍏 🍇
알러지 유발 요소
- 우유
- 대두
- 계란
- 밀
- 복숭아
- 알류
- 아몬드
- 계피
- 이산화황
메뉴판 탈탈 털었음;;;;
class Allergy(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = 'allergy'
// in main directory
python manage.py shell
>>>
>>> from products.models import Allergy
>>> Allergy.objects.all()
<QuerySet []>
>>>
column 의 값이 전부 FK 로만 이뤄지는 테이블!! (추가 요소가 필요 없엉)
class AllergyDrink(models.Model):
allergy = models.ForeignKey('Allergy', on_delete = models.SET_NULL, null=True)
drink = models.ForeignKey('Drink', on_delete = models.SET_NULL, null=True)
class Meta:
db_table = 'allergydrink'
// in main directory
python manage.py shell
>>>
>>> from products.models import AllergyDrink;
>>> AllergyDrink.objects.all()
<QuerySet []>
>>>
어떤걸 순서대로 정렬하는게 좋을지,,,, 모르겠다!!
제대로 참조되었는지 장고쉘에서 확인해보았다.
>>> a = AllergyDrink.objects.get(id=1)
>>> a.allergy
<Allergy: Allergy object (1)>
>>>
아니... 값을 알려줘....
문자열로 출력하기 위해 __str__ 함수를 추가하기로 했다.
// in products/models.py
class AllergyDrink(models.Model):
allergy = models.ForeignKey('Allergy', on_delete = models.SET_NULL, null=True)
drink = models.ForeignKey('Drink', on_delete = models.SET_NULL, null=True)
class Meta:
db_table = 'allergydrink'
def __str__(self):
return self.allergy
근데 왜 안되지????
일단 change가 없다며 makemigrations 가 안된다. 오잉?
>>> a = AllergyDrink.objects.get(id=4)
>>> a.allergy
<Allergy: Allergy object (1)>
>>> a.allergy_id
1
>>> a.drink
<Drink: Drink object (4)>
>>> a.drink_id
4
>>>
문자열로 확인이 안되네;;;
drinks 와 images는 one to many
의 관계이다!! 하나의 음료는 여러 사진을 갖고잇지만, 사진 하나는 하나의 음료만 가리킨다.
class Image(models.Model):
drink = models.ForeignKey('Drink', on_delete = models.CASCADE, null=True)
image_url = models.URLField(max_length=2000)
class Meta:
db_table = 'images'
아... 이디야는 우클릭이 안먹힌다..;;;;;;; 그러면 alt+cmd+i
...
>>> from products.models import Image
Traceback (most recent call last):
File "<console>", line 1, in <module>
ImportError: cannot import name 'Image' from 'products.models' (/Users/chyun/MyProjects/wediya17/products/models.py)
흠,,
drinks 와 allergy는 다대다 관계이다.! 그래서 중간테이블로 AllergyDrink라는 클래스를 만들어 allergydrink 라는 테이블을 만들어 주었다.
그런데.. 중간테이블을 직접 클래스를 선언하여 만들지 않더라도 만들 수 있는 방법이 있다.!!
class Drink(models.Model):
name = models.CharField(max_length=30)
name_en = models.CharField(max_length=40, null="True")
category = models.ForeignKey('Category', on_delete=models.CASCADE)
allergy = models.ManyToManyField('Allergy')
class Meta:
db_table = 'drinks'
class Drink(models.Model):
name = models.CharField(max_length=30)
name_en = models.CharField(max_length=40, null="True")
category = models.ForeignKey('Category', on_delete=models.CASCADE)
allergy = models.ManyToManyField('Allergy', through='AllergyDrink')
class Meta:
db_table = 'drinks'
내 중간 table의 class 명이 AllergyDrink이다.
이후 makemigrations > migrate
그보다,,, 먼저 한쪽 table에 ManyToManyField
로 연결시켜 중간 table이 생기게 의도하는데, 보다 편리한 관리(?)를 위해 따로 중간table을 만들어 연결하는 듯 하다!!
ManyToManyField를 만들어도 해당 table의 column에는 변화가 없어보인다.
class Drink(models.Model):
name = models.CharField(max_length=30)
name_en = models.CharField(max_length=40, null="True")
category = models.ForeignKey('Category', on_delete=models.CASCADE)
allergy = models.ManyToManyField('Allergy', through='AllergyDrink')
class Meta:
db_table = 'drinks'
OneToMany
ManyToMany
Field를 추가하는 것의 의미 알기one to one
으로 연결