티스토리 뷰
장고 튜토리얼 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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 웹페이지
- 혼자 공부하는 파이썬
- 디자인 패턴
- Java
- django.contrib.auth
- 검색 결과 내 페이지네이션
- git
- django
- error: failed to push some refs to 'https://github.com/
- Spring
- 암호화
- 한글 형태소 분석기
- 회원 로그인
- 커맨드 객체
- Django tutorial
- musma
- API
- 환경 변수 설정
- authenticate()
- 배열
- Magazine K
- django-environ
- git공부
- python3
- git 공부
- Python
- 회원가입
- 면접을 위한 CS 전공 지식 노트
- path variable
- 톰캣
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함