Django crud2


Django Crud課題、Westarbucks課題進行中!
過去の時間だったので見たかったTIL!
8. models.py에서 class만들어주기!
예시1)
class Menu(models.Model):
    name = models.CharField(max_length=45)
    class Meta:
        db_table = 'menus'

# Menu라는 클래스, models.Model은 기본값.
# CharField 문자열을 썼고, 최대 길이가 45.
# 테이블 이름을 정해주기 위해 class Meta를 만들고, db_table = 'menus'라고 함.
# 클래스 값은 앞에가 대문자, 테이블값은 소문자.

예시2)
class Category(models.Model):
    menu_id = models.ForeignKey('Menu', on_delete = models.CASCADE)
    name = models.CharField(max_length=45)
    class Meta:
        db_table = 'categories'
# Category라는 클래스이며 menu를 참조하고 있는 클래스이다. 
# on_delete = models.CASCADE는 Menu클래스가 사라지면 Category클래스도 없어진다는 뜻!

예시3)
class Product(models.Model):
    category_id = models.ForeignKey('Category', on_delete = models.CASCADE)
    korean_name = models.CharField(max_length = 45)
    english_name = models.CharField(max_length = 45)
    description = models.TextField()
    nutrition_id = models.ForeignKey('Nutrition', on_delete = models.CASCADE)
    allergy = models.ManyToManyField('Allergy', through = "AllergyProduct")

    class Meta:
        db_table = 'products'
# Product 클래스, Category와 Nutrition을 참조하고 있는 클래스.
# 중요한게 Allergy클래스와 다대다 관계이기 때문에 두 클래스 중 하나에 models.ManyToManyField('Allergy', through = "AllergyProduct") <- 이런식으로 연결해주는 식을 적어 주어야한다. 여기서 AllergyProduct는 중간테이블.

예시4)
class AllergyProduct(models.Model):
    allergy = models.ForeignKey('Allergy', on_delete = models.CASCADE)
    product = models.ForeignKey('Product', on_delete = models.CASCADE)

    class Meta:
        db_table : "allergyproducts"
# 예시3에서 말한 중간테이블이며 따로 이렇게 적어주지 않을 경우, Django가 임의로 정하기 때문에 꼭 넣어주어야하는 테이블!

9. migrations와 migrate.
데이터베이스에 테이블을 저장해주는 방법이라고 생각하면됨.
python manage.py makemigrations # 메인 디렉토리에서 진행.
python manage.py migrate #요것도 메인 디렉토리에서.

10. MySQL
앞서 4번 과정에서 접속했던 MySQL에서 내가 만든 테이블들 다 볼 수 있다.
Command+D하면 terminal창 하나 더 열기
Shift+Command+D하면 terminal창 밑으로 하나 더 열기
show databases;
use 내db명;
show tables;
select * from table_name;
desc table_name;
exit

# terminal창 끈다고 끈거 아니니까 exit 한번더 눌러주고 끄기
# shell에서 create해주어야 빈테이블에 값이 생긴다.
# ; 요것 잊어버리지 말기!

11. 내부 데이터 입력(Shell활용)
python manage.py shell
from 앱이름.models import Class_name1, Class_name2...
#요 두개 세팅 꼭해주기

Product.objects.create(name = '상품')
#클래스명.objects.(create,get...)(값 입력)

Product.objects.filter(id=3).delete()
#삭제값.

a = Product.objects.get(id=1)
a.one_serving_kcal = 140kcal
a.save()
# 수정하기.

a = Product.objects.get(id=1)
Category.objects.create(name = '프라푸치노', menu = a)
# 변수활용해주어서 get으로 값얻고, foreign key 값 가진 클래스에 넣어주기

12. 수정?
혹시라도 models.py에 수정사항이 생기면 수정해주고 나서
migrations와 migrate를 꼭꼭 챙겨서 해주어야 업데이트가 됨! 잊지말기~