Django C.R.U.D (1)

Jeongyun Heo·2021년 1월 20일
0

django

목록 보기
2/4
post-thumbnail

URLconf: Client 요청 분석. 페이지 요청 시 가장 먼저 호출되며, 요청 URL과 뷰 함수를 1:1로 연결해 준다.(urls.py와 views.py가 매핑되어 연결된다.)(뷰 함수는 화면을 보여 주기 위한 함수로, views.py에 있는 함수다.)

View: 요청을 처리하기 위한 모듈. 함수들 들어있음.

Model: Database 작업 관련 모듈. Data 생성/조회/수정/삭제

Model에서 데이터베이스와 connection을 하고 데이터를 가지고 옴
그러면 데이터베이스에서 다시 Model로 데이터를 보내줌
그리고 Model이 View에 받은 데이터 전달

장고는 Model로 데이터를 관리한다.

Model을 작성하고 ORM을 통해서 데이터베이스에 테이블을 만들고
데이터를 생성(C), 조회(R), 수정(U), 삭제(D)하는 방법을 알아보자

장고의 ORM은 쿼리문을 몰라도 데이터 작업을 할 수 있다

장고의 ORM은 쿼리문을 몰라도 데이터 작업을 할 수 있다. 왜냐하면 장고에는 ORM(object relational mapping)이라는 기능이 있기 때문이다. ORM은 파이썬으로 데이터 작업을 할 수 있게 해주는 기능이라고 생각하면 된다. 즉, 장고에서는 쿼리문을 몰라도 파이썬을 안다면 데이터를 다룰 수 있다.

장고의 ORM은 데이터베이스의 테이블을 모델화하여 사용한다. ORM이 쿼리문을 자동으로 생성하므로 통일성이 보장된다. 그리고 쿼리문 자체를 잘못 작성할 가능성도 사라진다. 또한 데이터베이스에 맞게 자동으로 쿼리문을 생성해 주므로 쿼리문 수정 작업이 사라진다. 바로 이것이 ORM을 사용하는 이유이다.

프로젝트 세팅 및 데이터베이스 구축

프로젝트 루트 디렉터리 생성
프로젝트를 모아 둘 프로젝트 루트 디렉터리 생성은 필수
나는 projects 디렉터리 만듦

프로젝트 루트 디렉터리로 이동
프로젝트 루트 디렉터리 안에서 가상환경에 진입하기 위해 이동한다


settings.py

INSTALLED_APPS:
INSTALLED_APPS는 현재 장고 프로젝트에 설치된 앱이다.

DATABASES:
DATABASES 속성 중 default의 'ENGINE' 항목을 보면 데이터베이스 엔진이 django.db.backends.sqlite3로 정의되어 있음을 알 수 있다. 그리고 'NAME' 항목을 보면 데이터베이스는 BASE_DIR에 있는 db.sqlite3이라는 파일에 저장되는 것도 알 수 있다.


👇  계속 명령어 앞에 conda 붙음

conda env list
conda 가상환경 목록을 보는 명령어
가상환경 뭐뭐 있는지, 위치(경로)까지 보여줌

가상환경 만들기

conda create -n 'westarbucks17' python=3.7
conda 새로운 가상환경 생성
※ 가상환경명은 프로젝트 명으로 통일하는 것으로 권장함

conda activate 'westarbucks17'
conda 가상환경 활성화하기

pip freeze
설치되어 있는 패키지 보여줌

가상환경에 django, mysqlclient 패키지 설치하기

pip install django
django 패키지 설치

pip freeze
설치된 패키지 목록 보기
django 잘 설치됐나 다시 보기

pip install mysqlclient
mysqlclient 패키지 설치

pwd
현재 위치 확인

장고 프로젝트를 담을 디렉터리 생성하고 이동

mkdir westarbucks17
'westarbucks17'이라는 새로운 디렉토리 생성
장고 프로젝트를 담을 디렉터리 생성하고 이동해야 됨

cd westarbucks17
해당 디렉토리로 이동
장고 프로젝트를 담을 디렉터리로 이동

ls
아무것도 안 나옴. 새로 만들어서 아무것도 안 들어있음.


폴더 이동시키는 법

mv westarbucks17 projects
mv '이동시키고 싶은 디렉터리' '이동하고 싶은 위치'
westarbucks17 디렉토리를 projects 디렉토리로 이동시킨다.

ls

cd projects
projects 디렉토리로 이동

ls
잘 옮겨졌는지 확인


cd westarbucks17
westarbucks17 디렉토리로 이동

ls
뭐뭐 있는지 보기. 아무것도 없음.

장고 프로젝트 생성하기

django-admin startproject westarbucks17 .
맨 뒤에 . 잊지 말기!!!!! 현재 위치라는 뜻
현재 디렉토리 위치에 새로운 프로젝트를 생성한다.

ls

manage.py     westarbucks17

manage.py 라는 파일과 생성한 프로젝트 이름(westarbucks17)으로 디렉토리가 하나 생김

cd westarbucks17
프로젝트 디렉터리로 이동

ls
뭐뭐 있는지 보기

__init__.py   asgi.py   settings.py   urls.py   wsgi.py

tree
tree 명령어로 보면 더 알아보기 쉬움

.
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py

0 directories, 5 files

ll or ls -l
파일 뭐뭐 있는지 더 상세하게 나옴
누가 작성했는지 언제 만들어졌는지..

app 생성 및 mysql 연동

앱 생성하기

cd ..
상위 디렉터리로 이동 (첫 번째 westarbucks17 폴더로 이동함)

python manage.py startapp products
products 라는 앱 만들기

ls -l

total 8
-rwxr-xr-x  1 nana  staff  669  1 20 17:25 manage.py
drwxr-xr-x  9 nana  staff  288  1 20 17:33 products
drwxr-xr-x  8 nana  staff  256  1 20 17:32 westarbucks17

tree

.
├── manage.py
├── products
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── westarbucks17
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-37.pyc
    │   └── settings.cpython-37.pyc
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

MySQL settings

데이터베이스 생성

command + N : 새로운 터미널 열기

mysql -u root -p
mysql server 접속

이제 여기부터는 명령어 뒤에 세미콜론(;) 붙여야 됨

show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westarbucks17      |
| wetwosome          |
+--------------------+

CREATE DATABASE wetwosome2 character set utf8mb4 collate utf8mb4_general_ci;
데이터베이스 생성

CREATE DATABASE 데이터베이스이름 character set utf8mb4 collate utf8mb4_general_ci;

Query OK, 1 row affected (0.03 sec)

show databases;
데이터베이스 목록에 추가되어 있음

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westarbucks17      |
| wetwosome          |
| wetwosome2         |
+--------------------+

cd westarbucks17
두 번째 westarbucks17 디렉터리로 이동
(프로젝트 디렉터리로 이동)
~/projects/wetwosome17/wetwosome

vi settings.py
settings.py 파일 수정하러 들어감
i 눌러서 수정하고 esc 누르고 :wq

INSTALLED_APPS에 새로 만든 앱 'products' 추가하고
DATABASES 속성 수정 및 추가 입력

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'products'
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'westarbucks17', (데이터베이스와 같은 이름)
        'USER': 'root',
        'PASSWORD': '비번',
        'HOST': '127.0.0.1', # 또는 ’localhost’
        'PORT': '3306',
    }
}

cd ..
manage.py 명령어를 사용하기 위해 manage.py 파일이 위치한 첫 번째 westarbucks17 폴더로 이동

python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations
for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January 20, 2021 - 09:09:35
Django version 3.1.5, using settings 'westarbucks17.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

개발 서버 종료 👉 Ctrl + C 누르면 종료됨

Database table 생성

models.py에 Product 테이블 작성하기

cd products
products 디렉터리로 이동

vi models.py
models.py 파일 열어서 수정하자

from django.db import models

# Create your models here.

class Product(models.Model):
    name          = models.CharField(max_length=50)
    description   = models.CharField(max_length=1000)
    menu          = models.ForeignKey('Menu', on_delete = models.SET_NULL, null=True)
    category      = models.ForeignKey('Category', on_delete = models.SET_NULL, null=True )
    allergy_drink = models.ManyToManyField('Allergy', through='AllergyDrink')
    
    class Meta:
        db_table = 'products'  # 생성되는 테이블 이름

cd ..

cd westarbucks17

두 번째 westarbucks17 디렉터리로 이동

vi settings.py
settings.py 파일 열어서 수정하자

ls

__init__.py  __pycache__  asgi.py  settings.py  urls.py  wsgi.py

tree

.
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-37.pyc
│   ├── settings.cpython-37.pyc
│   ├── urls.cpython-37.pyc
│   └── wsgi.cpython-37.pyc
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py

1 directory, 9 files

cd products
products 디렉터리로 이동

vi models.py
아마 다시 들어가서 맨 위에 두 개 빼고 주석 처리 해줬던 거 같음

from django.db import models

# Create your models here.

class Product(models.Model):
    name          = models.CharField(max_length=50)
    description   = models.CharField(max_length=1000)
#    menu          = models.ForeignKey('Menu', on_delete = models.SET_NULL, null=True)
#    category      = models.ForeignKey('Category', on_delete = models.SET_NULL, null=True)
#    allergy_drink = models.ManyToManyField('Allergy', through='AllergyDrink')

    class Meta:
        db_table = 'products'

migration & migrate

이제 장고한테 테이블 만드는 명령어를 줄 수 있다.
2가지 과정이 필요하다.

  1. migration
  2. migrate

cd ..
manage.py 명령어를 실행하기 위해 manage.py가 있는 첫 번째 westarbucks17 디렉터리로 이동

python manage.py makemigrations products
클래스를 테이블로 만들기 위한 명령어를 생성하는 명령어
명령하는 파일을 만드는 명령어
명령어들이 모여 있는 파일을 만드는 명령어

Migrations for 'products':
  products/migrations/0001_initial.py
    - Create model Product

python manage.py migrate products
makemigrations 하고 나서 실행해준다.
(manage.py 명령어이므로 manage.py가 있는 위치에서 실행)
명령어가 모여 있는 파일들을 실행시켜서 실제 테이블을 만드는 명령어

Operations to perform:
  Apply all migrations: products
Running migrations:
  Applying products.0001_initial... OK

0개의 댓글