Meme's IT

[Django] Model과 Migrations 본문

BackEnd/Django

[Django] Model과 Migrations

Memez 2023. 9. 14. 15:38

# Django의 MTV 패턴

  • Model: 데이터와 관련된 로직, 데이터베이스(SQLite)를 관리
  • Template: 보여지는 부분 (html파일)
  • View: Model과 Template와 관련된 로직이 들어가는 곳, 중계자의 역할을 함

그 중, Django의 Model은 DB의 테이블을 정의하고 데이터를 조작하는 등의 기능을 제공한다.

 

 

 

Model Field

DB 테이블의 필드(= 열)을 정의하며, 해당 필드에 저장되는 데이터 타입과 제약조건을 정의한다.

 

Model Field의 종류

  • CharField(): 길이 제한이 있는 문자열을 넣을 때 사용(max_length가 필수 인자)
  • TextField(): 글자의 수가 많을 때 사용
  • DateTimeField(): 날짜와 시간을 넣을 때 사용
    • auto_now: 데이터가 저장될 때마다 자동으로 현재 시간을 저장(= 수정)
    • auto_now_add: 데이터가 처음 생성될 때만 자동으로 현재 날짜 시간을 저장(= 작성)

 

 

 

Migrations

model 클래스의 변경사항(필드 생성, 수정)을 DB에 최종 반영하는 방법

설계도 초안(Model)과 DB는 서로 다른 언어를 사용하므로 꼭 해줘야 하는 과정!

migrations의 과정

 

  • makemigrations: model class를 기반으로 최종 설계도 작성
python manage.py makemigrations

 

  • migrate: 최종 설계도를 DB에 전달하여 반영
python manage.py migrate

 


 

직접 해보기

# articles/models.py 위치

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length = 10)
    content = models.TextField()

 

클래스의 변수명(title, content)는 테이블의 각 필드(= 열)의 이름이 된다.

  • DB에서의 열(column) = 필드 / 행(row) = 레코드

이후, 터미널에 

# makemigrations
python manage.py makemigrations


# migrate
python manage.py migrate

두 명령어를 입력해서 migration을 진행

EXPLORER의 db.sqlite3파일 우클릭 > Open Datebase > SQLITE EXPLORER가 생긴걸 확인할 수 있다.

 


# models의 필드를 더 추가해줄려면?

# models.py 위치에 추가적으로 작성

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=10)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

터미널에서 makemigrations를 진행,

이미 기존 테이블이 존재하기 때문에 추가할 때 필드의 기본 값을 설정해줘야한다.

두개의 옵션 중 하나 선택(1 = 자동 , 2 = 수동) 

기본값을 현재 시간으로 할껀지에 대한 옵션 → 그냥 엔터

이후 migrate까지 해주면 완료

SQLITE EXPLORER 를 새로고침해주고 확인하면 추가된 것을 확인할 수 있다.

 

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

[Django] ORM과 QuerySet API  (0) 2023.09.15
[Django] Admin Site  (0) 2023.09.14
[Django] App URL  (0) 2023.09.14
[Django] 변수와 URL  (0) 2023.09.14
[Django] form활용: throw & catch  (0) 2023.09.13