Django-DB 연습 #2

채록·2021년 1월 24일
0

Python & Django

목록 보기
9/34
post-thumbnail

🐶 To do list

  • Allergies & drinks many to many로 연결
  • images table one to many로 연결

짚고 넘어갈 개념
ForeignKey --> one to many 의미
OneToOneField --> one to one 의미
ManyToManyField --> Many to Many 의미


수행 프로젝트

Django-DB 연습 #1에 만들었던 wediya 로 계속 진행! 🍎 🍊 🍋 🍏 🍇






I. allergies tabel 만들기

알러지 유발 요소

  • 우유
  • 대두
  • 계란
  • 복숭아
  • 알류
  • 아몬드
  • 계피
  • 이산화황

메뉴판 탈탈 털었음;;;;


1) vi products/models.py 에서 class 추가

class Allergy(models.Model):
        name = models.CharField(max_length=20)

        class Meta:
                db_table = 'allergy'

2) makemigrations & migrate products


3) instance 만들기 (Create / in Django shell)

// in main directory
python manage.py shell
>>>
i) instance 만들기 전 read
>>> from products.models import Allergy
>>> Allergy.objects.all()
<QuerySet []>
>>>
ii) 만드는중 ,,,






II. drinks - allergy 중간 table 만들기

column 의 값이 전부 FK 로만 이뤄지는 테이블!! (추가 요소가 필요 없엉)


1) vi products/models.py 에서 class 추가

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'

2) makemigrations & migrate products


3) instance 만들기 (Create / in Django shell)

// in main directory
python manage.py shell
>>>

i) 만들기 전 read

>>> from products.models import AllergyDrink;
>>> AllergyDrink.objects.all()
<QuerySet []>
>>>
ii) 만드는 중..

어떤걸 순서대로 정렬하는게 좋을지,,,, 모르겠다!!

iii) 참조 확인하기

제대로 참조되었는지 장고쉘에서 확인해보았다.

>>> 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
>>>

문자열로 확인이 안되네;;;

구글링 해보니까 drink table에 manytomanyField라는걸 추가해주는데 일단 방법을 정확히 몰라서 패스! 이후에 내용 추가할 것






III. images table 만들기

drinks 와 images는 one to many의 관계이다!! 하나의 음료는 여러 사진을 갖고잇지만, 사진 하나는 하나의 음료만 가리킨다.

images table에 drinks의 PK를 FK로 받기


1) vi products/models.py 에서 class 추가

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'

2) makemigrations & migrate products


3) instance 만들기 (Create / in Django shell)

아... 이디야는 우클릭이 안먹힌다..;;;;;;; 그러면 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)

흠,,

❓urlField를 사용하기 위해 설치해야하는게 있는것 같다! 추후에 다시 알아보고 내용 수정하기!!





IV. ManyToManyField 설정

drinks 와 allergy는 다대다 관계이다.! 그래서 중간테이블로 AllergyDrink라는 클래스를 만들어 allergydrink 라는 테이블을 만들어 주었다.

그런데.. 중간테이블을 직접 클래스를 선언하여 만들지 않더라도 만들 수 있는 방법이 있다.!!

다대다 관계에 있는 한쪽 class에 반대쪽 class를 ManyToManyField로 넣어준다.

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'

만약 중간 table을 사용할 경우 trought를 통해 중간테이블을 연결시켜 준다.

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

❓ManyToManyField로 연결시켜 주는 이유는 ?

그보다,,, 먼저 한쪽 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'

❓그럼 중간테이블 만들면 MTMField로 안해줘도 되납???? 알아보고 내용 수정하기!!

중간 마무리











🐱 추가할 것

  • image table 다루는 법 : URLField
  • OneToMany ManyToMany Field를 추가하는 것의 의미 알기
  • 신상여부에 대해 drinks table에 TINYINT type으로 생성
  • drink와 nutrition one to one으로 연결
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글