티스토리 뷰

장고 튜토리얼 models.py 에서는 함수(def)로 정의했으나 클래스(class)로 정의해보았다.

# 데이터 베이스 테이블이 될 class를 작성 (첫글자 대문자)
class Category(models.Model):
# Category 테이블의 column이 되는 부분('name')과 row 값(models.~~~)이 들어가는 부분이다 
# 값은 python3 shell 에서 직접 넣어준다
    name = models.CharField(max_length = 50)
    menu = models.ForeignKey('Menu', on_delete = models.CASCADE)
    
# 데이터 테이블의 이름이 되는 코드 복수형으로 작성
    class Meta:
        db_table = 'categorise'
        
 # mysql 에서 Category 테이블 출력시 아래와 같이 나온다       
+----+--------------------------------+---------+
| id | name                           | menu_id |
+----+--------------------------------+---------+
|  1 | 콜드 브루 커피	              |       1 |
|  2 | 브루드 커피                       |       1 |
|  3 | 에스프레소                        |       1 |
+----+--------------------------------+---------+

> 스타벅스 공식 홈페이지를 참고하여 westarbucks/products/models.py에 데이터 베이스에 넣을 데이터 테이블 작성

실행 과정 )

from tkinter import CASCADE
from unittest.util import _MAX_LENGTH
from django.db import models

# class 첫 글자는 대문자로 작성
class Menu(models.Model):
    name = models.CharField(max_length = 50)
    class Meta:
        db_table = 'menus'

class Category(models.Model):
    name = models.CharField(max_length = 50)
    # on_delete 옵션은 ForeignKeyField가 바라보는 값이 삭제될 때 처리하는 방법을 지정해준다
    # CASCADE는 바라보는 값이 삭제될 때 fk를 포함하는 모델 인스턴스도 같이 삭제한다
    menu = models.ForeignKey('Menu', on_delete = models.CASCADE) # Menu class 연결
    class Meta:
        db_table = 'categorise'

class Drink(models.Model):
    name_ko = models.CharField(max_length = 50)
    name_en = models.CharField(max_length = 200)
    description = models.TextField(max_length = 2000)
    category = models.ForeignKey('Category', on_delete = models.CASCADE) # Category class 연결
    nutrition = models.ForeignKey('Nutrition', on_delete = models.CASCADE) # Nutrition class 연결
    # 다:다 관계는 many to many Field 사용 / through = '중간 필드 이름' 
    allergy = models.ManyToManyField('Allergy', through = 'Allergy_product' ) # Allergy_food class 연결   
    class Meta :
        db_table = 'drinks'

class Image(models.Model):
    # 이미지?어떻게 처리하지?..? 링크로?
    image_url = models.CharField(max_length = 3000)
    drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
    class Meta : 
        db_table = 'images'

class Nutrition(models.Model):
    calories_kacl = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    sodium_mg = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    sugars_g = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    caffein_mg = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    protein_g = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    fat_g = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
    class Meta : 
        db_table = 'nutritions' 

class Allergy(models.Model):
    name = models.CharField(max_length = 40)
    class Meta : 
        db_table = 'allergies'

class Allergy_product(models.Model):
    allergy = models.ForeignKey('Allergy', on_delete = models.CASCADE, null = True) # Allergy class 연결
    drink = models.ForeignKey('Drink', on_delete = models.CASCADE) # Product class 연결
    class Meta : 
        db_table = 'allergies_food'

 

> models.py 에 데이터 테이블 class로 정의 후 makemigrations / migrate 해주기

: 장고에게 데이터 모델을 생성(수정)했다는 것을 알려주기 위함

 

 명령어

# models.py 내용 수정 후에도 동일한 순서로 데이터베이스에 적용시켜줘야한다..(?)
% python3 manage.py makemigrations
% python3 manage.py migrate

실행 과정 )

(35th) yujeong@xo-MacBook-Air westarbucks % python3 manage.py makemigrations
Migrations for 'products':
  products/migrations/0001_initial.py
    - Create model Allergy
    - Create model Allergy_product
    - Create model Category
    - Create model Menu
    - Create model Nutrition
    - Create model Drink
    - Create model Image
    - Add field menu to category
    - Add field product to allergy_product
    
(35th) yujeong@xo-MacBook-Air westarbucks % python3 manage.py migrate
Operations to perform:
  Apply all migrations: contenttypes, products, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying products.0001_initial... OK
  Applying sessions.0001_initial... OK

→ mysql 명령어 

mysql -u root -p # mysql 접속 
show databases; # 데이터 베이스 목록 확인
use 데이터베이스 이름; # 사용할 데이터 베이스 선택
show tables; # 테이블 확인
desc 테이블 이름; # 선택한 테이블의 정보 확인
select * from 테이블 이름 # 해당 테이블의 모든 데이터 확인

> products/models.py 파일에 작성한 데이터 테이블이 잘 들어갔는지 mysql에서 확인

실행 과정 )

(35th) yujeong@xo-MacBook-Air westarbucks % mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 8.0.29 Homebrew

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use westarbucks;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>

> models.py 에 작성한 데이터 베이스 테이블이 만들어진 것을 볼 수 있다.

실행 과정 )

mysql> show tables;
+-----------------------+
| Tables_in_westarbucks |
+-----------------------+
| allergies             |
| allergies_food        |
| categorise            |
| django_content_type   |
| django_migrations     |
| django_session        |
| drinks                |
| images                |
| menus                 |
| nutritions            |
+-----------------------+
10 rows in set (0.01 sec)

mysql> desc drinks;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | bigint      | NO   | PRI | NULL    | auto_increment |
| name_ko      | varchar(50) | NO   |     | NULL    |                |
| name_en      | varchar(50) | NO   |     | NULL    |                |
| description  | longtext    | NO   |     | NULL    |                |
| category_id  | bigint      | NO   | MUL | NULL    |                |
| nutrition_id | bigint      | NO   | MUL | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

> 생성한 데이터 테이블에 값을 넣어주기 위해 파이썬 쉘에서 작업

→ shell 실행 명령어

% python3 manage.py shell

> 데이터를 생성해야하기 때문에 create() 메소드를 주로 사용하여 db 테이블에 넣어주었다. (단순반복)

# create() 메소드

>>>클래스명.objects.create(매개변수1 = '값1', 매개변수2 = '값2' ....)

> 넣은 데이터는  테이블에서 확인할 수 있다.

mysql> select * from categorise;
+----+--------------------------------+---------+
| id | name                           | menu_id |
+----+--------------------------------+---------+
|  1 | 콜드 브루 커피          	       |       1 |
|  2 | 브루드 커피                       |       1 |
|  3 | 에스프레소                        |       1 |
|  4 | 프라푸치노                        |       1 |
|  5 | 블렌디드                         |       1 |
|  6 | 스타벅스 리프레셔                   |       1 |
|  7 | 스타벅스 피지오                    |       1 |
|  8 | 티(티바나)                       |       1 |
|  9 | 기타 제조 음료                    |       1 |
| 10 | 스타벅스 주스(병음료)               |       1 |
+----+--------------------------------+---------+
10 rows in set (0.01 sec)

 

'study > Django' 카테고리의 다른 글

Django - QuerySet 다루기 (초보)  (0) 2022.07.09
Django - MtoM Field 없이 구현  (0) 2022.07.06
Django tutorial 따라하기 4  (0) 2022.06.30
Django tutorial 따라하기 3  (0) 2022.06.29
Django tutorial 따라하기 2  (0) 2022.06.29
댓글