dJango Web Framework
- dJango를 활용한 application 개발의 핵심은
URLconf, View, Model
이 중 Model 에 대한 이해를 해보는 실습이다!
훠후 글 쓰면서도 이해가 안되지만
데이터베이스와 관련된, table 생성 및 데이터 다루는 쿼리를 관리하는 Model이라는 객체를 생성한다고? 이해하고 진행할 예정!
우리가 만들 가상의 데이터를 올릴 WAS(Web Application Server)와 Database 생성해주기!
dJango, Database를 공부했으니 이제 백앤드 관점에서 Model을 작성하고
ORM을 통해서 Database table 생성하고 데이터 다루는 것을 실습하는 날이다.
학습목표
- Server - Database의 data flow 이해하기
- MVT 패턴 중 M 이해하기
- QuerySet API 이해 및 연습하기
자 우선 실습 환경을 구축하쟙
conda create -n "CRUD_1" python=3.8
conda activate CRUD_1
우선 작업을 시작하기 위해 conda 가상환경을 세팅 & 활성화해주자!
pip install django
pip install mysqlclient
dJango, mysql 또한 설치해주기!
(mysqlclient는 이후에 mysql server에 접속하기 위한 package라고 한다)
이전에 mysite / polls 관리자 사이트를 생성하면서 대략 잡았었던 project & application 개념을 생각해보자.
우선 startproject라는 명령어를 통해 디렉토리 & 프로젝트를 생성했었고
기능 구현을 위해 startapp 명령어로 어플리케이션을 생성했었다.
westartucks라는 프로젝트를 생성하고, 그 안에 products라는 app을 생성해주기!
처음엔 엄청 헷갈렸었는데.. 이젠 좀 잡히는 느낌
더 많이 실습 해보면 좀더 잘 잡히겠지
빠이링..!!
create database westarbucks character set utf8mb4 collate utf8mb4_general_ci;
show databases;
use westarbucks;
데이터베이스명에 큰따옴표를 붙였더니 내내 syntax 에러가 났다.
왜..? 지금까지는 항상 넣었던거 같은데..
mysql 너 정말..
무튼 요로케 👆🏻👆🏻👆🏻 생성된 데이터베이스들을 확인할 수 있다.
westarbucks 데이터베이스를 사용하겠다고 선택한 뒤
이제 테이블들을 생성할 model을 생성하러 가보쟈!
conda 가상환경에 생성해둔 westudy 프로젝트 내 settings.py 파일을 수정해줘야 한다!
수정 항목
- ip 허용
ALLOWED_HOSTS = ['*']
- 주석처리
: admin, auth, csrf, 등 주석처리! (사용하지 않는 요쇼들이므로)
:INSTALLED APPS
에 새로 생성된 앱인 products를 추가해주어야
dJango에서 우리가 새로 작성하고있는 앱을 인식할 수 있다.
: westarbucks/urls.py도 수정해주기!! 👈🏻👈🏻 중요하다고 한다from django.urls import path - urlpatterns = [ ]
- MySQL database와 연동
: dJango는 기본적으로 sqlite3와 연동이 되어있는데,
이걸 내가 사용하기로 한 mysql 데이터베이스와 연동해줘야 쓸 수 있겠지!DATABASES = { 'default' : { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'DATABASE 명', 'USER': 'root', 'PASSWORD': 'DB접속용 비밀번호', 'HOST': '127.0.0.1', 'PORT': '3306', } }
👆🏻 요로케 필요한 항목들 적어주기!
from django.db import models
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 Product(models.Model):
name = models.CharField(max_length=100)
price = models.IntegerField()
menu = models.ForeignKey('Category', on_delete=models.CASCADE)
👆🏻 이런식으로 수정 꼬!
manage.py 파일로 우리가 작성한 products 앱 makemigrations를 실행한 결과
👇🏻👇🏻 0001_initial.py
에 내가 model.py
에 작성해둔 테이블들 관련 모델이 생성되었다고 뜬다
하지만 아직은 실제 테이블들이 생성된 것은 아닌 상태!
데이터베이스에서 show tables;
쿼리를 입력해도 Empty set
이라고 나온다.
이제 database에 진짜 table 생성을 하기 위해 migrate를 진행하면
👇🏻👇🏻 요로케 테이블들이 생성되어있는 것을 알 수 있다!
👇🏻 showmigrations
를 사용하면 내가 실행한 migrate
가 잘 적용되었는지 확인할 수 있다.
X 표시가 반영되었다는 뜻!
ORM이라는 파이썬의 라이브러리 덕택에 파이썬 코드가 database의 table이 될 수 있는 것!
Object-relational Mappers (ORMs)
An object-relational mapper (ORM) is a code library that automates the transfer of data stored in relational database tables into objects that are more commonly used in application code.
우리가 지금까지 models.py
에 작성한 것은 테이블의 컬럼 및 기본 속성!
이제 테이블 내 데이터들을 채워 줄 차례이다
dJango shell을 통해서 대화형식으로 DB와 소통이 가능한데,
> python manage.py shell
👆🏻 코드를 입력하면 DB와 직접 대화할 수 있는 shell창이 열린다.
manage.py
는 dJango에게 최상위 폴더로 인식되기 때문에, 내가 사용하고자 하는 폴더 내 파일의 클래스(테이블)를 import 해주어야 한다.
변수에 담아서 데이터 확인하기
> menu = Menu.objects.get(컬럼 = "") > menu.컬럼
CREATE
create()
,save()
,bult_create()
등 사용!- FK 참조하고 있는 경우, FK의 값을 변수에 담아서 create 해주기!
> Menu.objects.create(컬럼 = "") - a3 = Menu(name="상품") >> a3.save() - > c1 = Category(name='콜드브루', menu_id=1) > c2 = Category(name='에스프레소', menu_id=1) > Category.objects.bulk_create([c1, c2])
READ
get()
,all()
,filter()
,exclude()
,values()
,values_list()
,count()
메서드와 필드 사용!> Menu.objects.get(name="음료") > AllergyDrink.objects.all().values() > Allergy.objects.get(id=2).id)
컬럼 엄청 많이 입력해야해서 짜증났을 때... 컬럼만 출력할 수 있는 쿼리!!
select COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='westarbucks'
and TABLE_NAME = 'products_nutritions';
+------------------+
| COLUMN_NAME |
+------------------+
| id |
| one_serving_kcal |
| sodium_mg |
| saturated_fat_g |
| sugars_g |
| protein_g |
| caffeine_mg |
| size_ml |
| size_fluid_ounce |
| drinks_id |
+------------------+
10 rows in set (0.00 sec)
후하 오타때문에 엄청 삽질했다.
- VARCHAR
name = models.CharField(max_length=20)
- INTEGER
int = models.IntegerField()
- DECIMAL
one_serving_kcal = models.DecimalField(max_digits=10, decimal_places=2)
- ForeignKey
menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
Decimal 타입일 때 default 값 주는 방법은 검색을 했는데도 모르겠다..
default = Decimal(0.00) 이렇게 주니까 자꾸 에러나서 결국 참고했던 페이지 👇🏻
Decimal Field_dJango