TIL 17 | Django C.R.U.D (1) practice

Hyeonju L.·2020년 12월 2일
1

Django

목록 보기
1/1

스타벅스 메뉴(데이터모델링) MySQL database에 테이블 생성하기

1. 초기 settings

1) 가상환경 설정 및 파이썬 패키지 설치
conda create -n westar_work python = 3.8	# miniconda 가상환경 생성 (가상환경 이름: westar_work)

conda activate westar_work 			# 가상환경 active

# 프로젝트에 필요한 python package 설치
pip install django 		# django 설치

pip install mysqlclient 	# MySQL 설치

westar_work 라는 가상환경 내에 Django 및 MySQL이 잘 설치된 것을 확인할 수 있다.

2) 프로젝트 및 앱 생성
django-admin startproject westarbucks	  # `westarbucks`라는 project 생성

cd westarbucks

python3 manage.py startapp practice 	  # `westarbucks` 프로젝트 내 `practice`라는 앱(app) 생성 

3) 데이터베이스 생성
mysql.server start		# MySQL 서버 스타트

mysql -u root -p		# MySQL 실행

# "westar"(database명) 라는 데이터베이스 생성
mysql> create database westar character set utf8mb4 collate utf8mb4_general_ci;

4) settings.py 설정
# 경로: westarbucks/westarbucks/settings.py 

ALLOWED_HOSTS = ['*']		# IP 허용

#사용하지 않는 요소 주석처리
 INSTALLED_APPS = [
      # 'django.contrib.admin',		# 주석처리
      # 'django.contrib.auth',		# 주석처리
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'practice',	# App 이름 추가
 ]
 
MIDDLEWARE = [
	'django.middleware.security.SecurityMiddleware',
	'django.contrib.sessions.middleware.SessionMiddleware',
	'django.middleware.common.CommonMiddleware',
      # 'django.middleware.csrf.CsrfViewMiddleware',		# 주석처리
      # 'django.contrib.auth.middleware.AuthenticationMiddleware',   # 주석처리
	'django.contrib.messages.middleware.MessageMiddleware',
	'django.middleware.clickjacking.XFrameOptionsMiddleware',
 ]
5) urls.py 설정
# 경로: westarbucks/westarbucks/urls.py

from django.urls import path

urlpatterns = [			# 내용삭제
]
6) MySQL database와 연동
# 경로: westarbucks/westarbucks/settings.py

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',			# 처음에 MySQL에서 지정한 이름
        'USER': 'root',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
7) practice/models.py 작성

만들고자 하는 데이터 테이블에 대해 models.py 작성

# 경로: westarbucks/practice/models.py
# 필요한 테이블 : 7개 (menu, categories, drinks, images, allergy, allergy_drink, nutritions)

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

class Category(models.Model):
	name = models.CharField(max_length=20)
	menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

class Drink(models.Model):
	K_name = models.CharField(max_length=100)
	E_name = models.CharField(max_length=100)
	description = models.TextField()
	category = models.ForeignKey('Category', on_delete=models.CASCADE)

class Image(models.Model):
	url = models.URLField()
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

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

class Allergy_Drink(models.Model):
	allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

class Nutritions(models.Model):
	calories = models.DecimalField(max_digits = 5, decimal_places = 1)
	sodium = models.DecimalField(max_digits = 5, decimal_places = 1)
	saturated_fat = models.DecimalField(max_digits = 5, decimal_places = 1)
	sugars = models.DecimalField(max_digits = 5, decimal_places = 1)
	protein = models.DecimalField(max_digits = 5, decimal_places = 1)
	caffeine = models.DecimalField(max_digits = 5, decimal_places = 1)
	size_ml = models.IntegerField()
	size_oz = models.IntegerField()
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
8) Data migration
# 경로: westarbucks

python3 manage.py makemigrations practice	# migration practice 생성

python3 manage.py migrate practice		# migration 실행

9) ORM을 통해 상세 데이터 생성
python3 manage.py shell

# models.py 에서 만든 class 가져오기
from practice.models import Menu, Category, Drink, Image, Allergy, Allergy_Drink, Nutritions 

# Menu 테이블 생성
# class Menu(models.Model):
#	name = models.CharField(max_length=20)
# 메뉴는 값으로 이름만 갖기 때문에 아래와 같이 데이터 추가

Menu.objects.create(name = "음료") 	# Menu에 음료 항목 생성(create)

MySQL에서 select * from practice_menu;를 치면 아래와 같이 생성된 menu 테이블을 불러올 수 있다.

# Category 테이블 만들기

>>> a1 = Category(name="콜드브루 커피", menu_id=1)
>>> a2 = Category(name="브루드 커피", menu_id=1)
>>> a3 = Category(name="에스프레소", menu_id=1)
>>> Category.objects.bulk_create([a1, a2, a3])

mysql> select * from practice_category;

이렇게 만든 전체 테이블은 다음과 같다

  • Drink

  • Allergy

  • Image

  • Nutritions

  • Allergy_Drink

  • ref.
    models.py에 입력한 테이블 정보를 MySQL에서 보고싶다면

   mysql> desc practice_nutritions;	# 테이블 정보 보기

profile
What you think, you become. What you feel, you attract. What you imagine, you create.

1개의 댓글

comment-user-thumbnail
2022년 2월 9일

정리 너무 잘해주셔서 도움 너무 많이 됐습니다 :)

답글 달기