Python/Django

Django 모델(Model) 정의 및 마이그레이션 이해하기

임베디드 친구 2025. 10. 31. 21:09
반응형

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) 모델을 정의하였습니다.

  • nameemail을 가지는 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

이제 AuthorBook 테이블이 데이터베이스에 생성되었습니다.


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 필드의 기본값은 18
  • auto_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 코드로 쉽게 정의할 수 있도록 도와줍니다. 또한, 마이그레이션 시스템을 활용하면 변경 사항을 쉽게 반영할 수 있습니다.

이번 포스팅에서는 기본적인 모델 정의, 필드 및 옵션, 그리고 마이그레이션을 다루었습니다.

반응형