로딩 중이에요... 🐣
04 모델(Model) 정의 및 마이그레이션 | ✅ 편저: 코담 운영자
Django 웹 프로그래밍 강좌 4강 - 모델(Model) 정의 및 마이그레이션 (Django 5.2 기준)
이 강의는 Django 공식 문서의 2.2 튜토리얼 내용을 바탕으로 진행되며, Django 5.2 버전에 맞춰 코드를 업그레이드하여 설명합니다.
📚 공식문서 주소: https://docs.djangoproject.com/ko/5.2/intro/tutorial02/
1. 데이터베이스 개요
웹 애플리케이션은 보통 데이터를 저장해야 하며, 이를 위해 데이터베이스(DB)를 사용합니다.
- Django는 기본적으로 SQLite를 내장 DB로 사용합니다.
- PostgreSQL, MySQL, Oracle 등의 데이터베이스로 쉽게 교체할 수 있습니다.
설정 파일에서 DB 엔진 변경하기
settings.py
의 DATABASES
항목을 아래와 같이 설정합니다:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
다른 DB를 사용할 경우,
ENGINE
값만 바꾸고, 관련 Python 드라이버를 설치하면 됩니다. 예:psycopg2
for PostgreSQL
2. 모델(Model) 정의
Django에서 모델은 데이터베이스 테이블의 구조를 정의합니다.
설문조사 기능을 위해 두 개의 모델을 정의합니다:
Question
: 질문 정보 (질문 텍스트, 등록일자)Choice
: 선택지 정보 (선택 텍스트, 득표 수, 관련 질문)
polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
CharField
: 문자열 저장 필드,max_length
필수DateTimeField
: 날짜/시간 정보 저장ForeignKey
: 다른 모델과 관계 설정 (1:N 관계)on_delete=models.CASCADE
: 참조된 객체 삭제 시 같이 삭제됨
하나의 Question에는 여러 Choice가 연결되므로 1:N 관계입니다.
3. 앱 등록 (INSTALLED_APPS
)
모델을 정의한 앱을 프로젝트 설정에 등록해야 Django가 인식합니다.
mysite/settings.py
INSTALLED_APPS = [
...
'polls.apps.PollsConfig',
]
'polls'
대신'polls.apps.PollsConfig'
로 명시하면 앱의 설정 클래스를 통해 세밀한 제어가 가능합니다.
4. 마이그레이션(Migrations)
마이그레이션은 모델 변경 사항을 DB에 반영하기 위한 작업입니다.
1단계: 마이그레이션 파일 생성
python manage.py makemigrations polls
- 모델 변경 사항을 감지하여
polls/migrations/
에 설계도 파일 생성
2단계: 실제 DB 반영
python manage.py migrate
- 생성된 마이그레이션 파일을 기반으로 실제 테이블 생성
마이그레이션은 앱 별로 여러 단계로 나뉘며 Django가 자동 관리합니다.
5. Django 셸에서 모델 다루기
셸 실행
python manage.py shell
모델 불러오기
from polls.models import Question, Choice
from django.utils import timezone
새 객체 생성 및 저장
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
데이터 조회
print(q.id) # 자동 생성된 기본 키
print(q.pub_date)
print(str(q)) # __str__ 반환 값 확인
Choice 추가
q.choice_set.create(choice_text="Not much", votes=0)
q.choice_set.create(choice_text="The sky", votes=0)
.choice_set
은related_name
을 설정하지 않은 경우 기본으로 제공됨
6. 커스텀 메서드 예시
최근 생성 여부 판단 메서드
from datetime import timedelta
def was_published_recently(self):
return self.pub_date >= timezone.now() - timedelta(days=1)
admin
,template
,test
등 다양한 곳에서 활용 가능- 모델 클래스 내부에 정의하여 재사용성을 높입니다
마무리 요약
- Django 모델 = DB 테이블 정의
makemigrations
→ 마이그레이션 파일 생성migrate
→ 실제 DB 반영- 셸을 통해 모델 객체 생성, 조회 가능
- 관계형 설계(1:N), 커스텀 메서드로 로직 분리 가능
다음 강의 예고
5강에서는 Django의 강력한 기능 중 하나인 관리자(admin) 기능을 학습합니다. 이를 통해 데이터베이스를 웹 인터페이스에서 직접 관리할 수 있게 됩니다.
감사합니다.