Django 모델(Model) 정의 및 마이그레이션 이해하기
1. 개요
Django에서 모델(Model) 은 데이터베이스의 테이블을 정의하는 핵심 요소입니다. Django의 ORM(Object-Relational Mapping)을 활용하면 SQL을 직접 작성하지 않고도 Python 코드로 데이터베이스를 조작할 수 있습니다.
이번 포스팅에서는 models.py 파일을 사용하여 모델을 정의하는 방법과 makemigrations, migrate 명령어를 활용하여 데이터베이스에 반영하는 과정을 설명하겠습니다.
2. 모델(Model)이란?
Django의 모델은 데이터베이스에서 테이블을 표현하는 클래스로, django.db.models.Model을 상속받아 정의합니다. 모델은 테이블의 필드(컬럼)과 해당 데이터에 대한 메타정보를 포함하고 있습니다.
2.1 모델 정의 예제
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
price = models.DecimalField(max_digits=10, decimal_places=2)
def __str__(self):
return self.title
위 예제에서는 작가(Author) 모델과 책(Book) 모델을 정의하였습니다.
name과email을 가지는Author모델Book모델에는title,author(ForeignKey),published_date,price필드가 포함되어 있습니다.ForeignKey를 사용하여Author모델과 관계를 맺고 있으며,on_delete=models.CASCADE를 설정하여 작가가 삭제되면 해당 작가의 책도 삭제되도록 설정했습니다.
3. 모델 마이그레이션(Migration) 과정
모델을 정의한 후, Django의 마이그레이션(migration) 기능을 이용해 데이터베이스에 적용해야 합니다.
3.1 마이그레이션 생성 (makemigrations)
마이그레이션을 생성하려면 다음 명령어를 실행합니다.
python manage.py makemigrations
실행 결과:
Migrations for 'myapp':
myapp/migrations/0001_initial.py
- Create model Author
- Create model Book
Django는 migrations/0001_initial.py라는 파일을 생성하며, 모델의 변경 사항이 기록됩니다.
3.2 데이터베이스에 반영 (migrate)
이제 생성된 마이그레이션을 데이터베이스에 반영합니다.
python manage.py migrate
실행 결과:
Operations to perform:
Apply all migrations: myapp
Running migrations:
Applying myapp.0001_initial... OK
이제 Author와 Book 테이블이 데이터베이스에 생성되었습니다.
4. 모델 필드와 주요 옵션
모델을 정의할 때 사용할 수 있는 주요 필드와 옵션을 살펴보겠습니다.
4.1 기본 데이터 타입 필드
| 필드명 | 설명 |
|---|---|
CharField(max_length=n) |
문자열 (최대 길이 지정 필수) |
TextField() |
긴 텍스트 저장 |
IntegerField() |
정수 저장 |
FloatField() |
실수 저장 |
BooleanField() |
True/False 값 저장 |
DateField() |
날짜 저장 (YYYY-MM-DD) |
DateTimeField() |
날짜 및 시간 저장 |
EmailField() |
이메일 형식 저장 |
DecimalField(max_digits, decimal_places) |
정밀한 소수 저장 |
ForeignKey(model, on_delete) |
다른 모델과 관계 설정 |
4.2 필드 옵션
| 옵션 | 설명 |
|---|---|
null=True |
데이터베이스에서 NULL 허용 |
blank=True |
폼 검증 시 빈 값 허용 |
default=value |
기본값 설정 |
unique=True |
중복 방지 (유일값) |
choices=[(A, B)] |
선택지 제공 |
예제: 다양한 필드 사용
class ExampleModel(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(blank=True, null=True)
age = models.IntegerField(default=18)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
unique=True:name필드는 중복을 허용하지 않음blank=True, null=True:description필드는 값이 없어도 됨default=18:age필드의 기본값은 18auto_now_add=True: 객체가 처음 생성될 때created_at자동 저장auto_now=True: 객체가 수정될 때updated_at자동 업데이트
5. 마이그레이션 관련 명령어 정리
| 명령어 | 설명 |
|---|---|
python manage.py makemigrations |
모델 변경 사항을 마이그레이션 파일로 생성 |
python manage.py migrate |
마이그레이션을 데이터베이스에 적용 |
python manage.py sqlmigrate app_name migration_id |
SQL 변환 결과 확인 |
python manage.py showmigrations |
적용된 마이그레이션 목록 확인 |
예제: 특정 마이그레이션 SQL 확인
python manage.py sqlmigrate myapp 0001
출력 예시:
CREATE TABLE myapp_author (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(254) UNIQUE NOT NULL
);
6. 결론
Django의 모델은 데이터베이스 테이블을 Python 코드로 쉽게 정의할 수 있도록 도와줍니다. 또한, 마이그레이션 시스템을 활용하면 변경 사항을 쉽게 반영할 수 있습니다.
이번 포스팅에서는 기본적인 모델 정의, 필드 및 옵션, 그리고 마이그레이션을 다루었습니다.
'Python > Django' 카테고리의 다른 글
| Django Admin 사이트 설정 및 커스터마이징 (admin.py) (0) | 2025.11.02 |
|---|---|
| Django ORM 기본 쿼리셋 사용법 (filter(), get(), all() 등) (0) | 2025.11.01 |
| Django에서 데이터베이스 설정하기 (settings.py에서 DATABASES 설정) (0) | 2025.10.30 |
| Django ORM(Object-Relational Mapping) 개념 및 사용법 (0) | 2025.10.29 |
| Django Template 엔진 활용법 (0) | 2025.10.28 |