Lina's Toolbox

Django Model 본문

Model

  • 저장할 데이터에 대한 필드와 동작들을 포함한 데이터베이스 구조 (layout)입니다.
  • Django는 Model을 이용해서 데이터를 조작합니다.
  • 일반적으로 하나의 Model은 하나의 데이터베이스 테이블을 의미합니다.

데이터베이스(Database)

  • 잘 정리된 데이터가 모여있는 것입니다.

쿼리(Query)

  • 데이터베이스를 조작할 수 있는 언어입니다.

스키마(Schema)

  • 데이터베이스의 구조, 관계 등을 정의한 것입니다.
    → 전반적인 명세서라고 할 수 있어요!

    🔽 스키마 예시
더보기

사용자 (Users)

  • 사용자 ID (User_ID) - 정수 (Integer)
  • 이름 (Name) - 문자열 (String)
  • 이메일 (Email) - 문자열 (String)
  • 주소 (Address) - 문자열 (String)

책 (Books)

  • 책 ID (Book_ID) - 정수 (Integer)
  • 제목 (Title) - 문자열 (String)
  • 저자 (Author) - 문자열 (String)
  • 출판사 (Publisher) - 문자열 (String)
  • 가격 (Price) - 부동 소수점 (Float)

주문 (Orders)

  • 주문 ID (Order_ID) - 정수 (Integer)
  • 사용자 ID (User_ID) - 정수 (Integer)
  • 책 ID (Book_ID) - 정수 (Integer)
  • 주문일 (Order_Date) - 날짜/시간 (Date/Time)
  • 수량 (Quantity) - 정수 (Integer)

 

테이블(Table)

  • 열(Column) - 속성 / 필드(Field)
  • 행(Row) - 데이터 / 레코드(Record) / 튜플(Tuple)
  • 조직화된 데이터 요소들의 집합입니다.

 

데이터베이스 기본 구조

User_ID Name Email Address
1 John Doe john@example.com 123 Main St
2 Jane Doe jane@example.com 456 Elm St

 

  • 테이블(Table)
  • 기본키, PK(Primary Key)
  • 열(Column)
  • 행(Row)

→ 우리는 이러한 데이터베이스를 Model을 사용해서 구조화 하고 조작할 예정입니다!


Model 작성해보기

1. models.py

from django.db import models


class Article(models.Model):
    pass

클래스 매개변수로 model.Model을 상속받는다.

  • models.Model을 상속받아서 사용하고자 하는 데이터 스키마를 정의합니다.
  • 모든 모델은 models.Model의 서브 클래스로 표현합니다.

 

2.필드 추가하기
→ 우선, 제목과 내용정도만 추가해줄게요.

from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
  • 각각의 필드는 테이블의 컬럼입니다.
  • 필드의 타입에 따라 사용하며, 각 필드별로 필요한 옵션들이 존재합니다.

마이그레이션(Migration)

 ⚠️ 현재 Python으로 Model 코드는 작성했지만 데이터베이스에는 반영이 안된 상태입니다.

 

마이그레이션

  • 우리가 파이썬으로 작성한 모델의 변경사항을, DB에 실제로 반영할 내용들을 적어놓은것 (모델의 변경사항들)
  • 변경의 단위가 된다.

⇒ Django는 마이그레이션(migration)을 만들고 이 단위로 데이터베이스에 변경사항을 반영하게 됩니다!

 

 

마이그레이션 관련 명령어

⭐ model에 생긴 변경사항을 마이그레이션으로 만드는 과정

python manage.py makemigrations

마이그레이션 생성

 

마이그레이션을 실제로 데이터에 반영해서 동기화 하는 과정

python manage.py migrate

반영되지 않은 마이그레이션 반영

 

참고)

  • 마이그레이션 목록과 적용여부를 보여주는 명령어
python manage.py showmigration
  • 해당 마이그레이션이 어떤 sql문을 작성했는지 보여주는 명령어
python manage.py sqlmigrate <app_name> <migration_no>

 

 

마이그레이션 적용하기

  1. Model 변경사항을 마이그레이션으로 생성
    → 데이터베이스 수준에서 변경이 필요한 사항
python3 manage.py makemigrations

각각의 앱 별로 migration이 생성됩니다.

해당 앱(폴더)의 migrations에 새로운게 생긴다! →0001_initial.py → 열어보자!

 

 

2. 마이그레이션을 반영

python manage.py migrate

  • 우리가 작성한 articles의 0001_initial 마이그레이션 적용 (빨간색)
  • 나머지는 Django가 여러가지 기능 제공을 위해 생성하는 마이그레이션입니다. (장고가 기본적으로 가지고있는)
    (첫 프로젝트 생성 후 한번은 migration을 먼저 해줘야하는 이유!)

3. 데이터베이스 확인하기

  • django는 기본적으로 sqlite 데이터베이스를 내장하여 사용합니다.
  • 개발시에는 이곳을 사용하다가 추후에 변경하는 방식으로 개발합니다.

SQLite VSCode Setting

  • .sqlite3 파일을 열어서 편하게 보기위해 설치
  1. install 진행

 

 

2. control + shift + p (맥은 command)를 눌러서 ‘SQLite: Open Database’ 선택

 

3. 내가 열고 싶은 데이터베이스 파일을 선택

이 db.sqlite3 파일이 바로 우리가 이 장고 프로젝트에서 사용하고 있는 데이터베이스이다!

 

4. 현재 내가 가지고 있는 테이블 목록들

* 참고: sqlite는 파일형 sql 이다.

→ 하고나면 sql 익스플로러가 생겼음! (좌측하단)

→ 눌러보면 현재 가지고있는 테이블 모두 보여줌

 

또는 여러가지 다른 데이터베이스 매니지먼트 프로그램들을 사용해서 열어도 됩니다! (ex. DBeaver …)

모든 모델클래스는 id라는 pk가 들어있다.
내가 pk를 따로 지정해주지 않아도 생기고, 값을 추가해주면 알아서 값이 1씩 증가하며 저장된다!

 

 

많이 쓰는 필드

생성일과 수정일

💡 어떤 테이블이든 많이쓰는 것 중 하나가 생성일과 수정일입니다!
생성일과 수정일에는 DateField 또는 DateTimeField를 사용하면 되지만 매번 직접 값을 넣어주면 불편하겠죠?

⇒ 생성일은 그냥 딱 알아서 데이터 들어와서 새로 생성되면 그때 날짜시간 넣어주고,

⇒ 수정일은 그냥 딱딱 알아서 데이터 수정되면 그때 날짜시간 반영을 해주기 위해서

  • auto_now_add=True & auto_now=True 사용하기
auto_now_add=True → 추가될 때 (최초에 생성될 때)
auto_now=True → 수정할 때마다

 

 

방금 Model을 수정했죠?

💡 모델을 수정했으니 마이그레이션 생성하고, 반영해주세요~

⇒ 기존에 생성한 데이터들은 어떻게 하겠냐고 묻습니다.

  1. 값하나를 주면 그 값을 다 넣는 방식 (디폴트 값 줘서 설정)
  2. 일단 종료하고 model로 돌아가서 기본값 설정하는 방식 (manually 기본값 넣기)

1번 선택

→ 값을 따로 입력하지 않아도 Enter만 치면 지금 시간을 계산해서 넣어주거나 아니면 값을 따로 입력하라고 합니다.

Enter

생성 완료

→ 해준 다음에 python3 manage.py migrate해줘야함

→ 생성일, 수정일 필드 생긴 것 볼수 있음