Django 모델 — 데이터 구조 정의
Django 모델 — 데이터 구조 정의
Django에서 데이터가 어떤 모양인지 정의하는 것이 **모델(model)**이에요. 모델은 데이터에 대한 정보의 결정적 원천(single, definitive source)이에요. 저장하는 데이터의 필수 필드와 동작을 담고, 보통 각 모델은 하나의 데이터베이스 테이블에 매핑돼요.
모델의 기본은 간단해요. 모델은 django.db.models.Model을 상속받는 파이썬 클래스이고, 모델의 각 속성(attribute)은 데이터베이스 필드를 나타내요. 그리고 이 모든 것을 바탕으로 Django가 자동 생성된 데이터베이스 접근 API를 제공해요.
빠른 예제
first_name과 last_name을 가진 Person 모델을 정의해 볼게요.
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
first_name과 last_name은 모델의 필드예요. 각 필드는 클래스 속성으로 지정되고, 각 속성은 데이터베이스 컬럼에 매핑돼요.
위 Person 모델은 대략 이런 데이터베이스 테이블을 만들어요.
CREATE TABLE myapp_person (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
기술적인 참고 사항 몇 가지예요. 테이블 이름 myapp_person은 모델 메타데이터에서 자동으로 유도되지만, 재정의할 수 있어요. id 필드는 자동으로 추가되지만, 이 동작도 재정의할 수 있어요. SQL은 데이터베이스 백엔드별로 달라져요 — 이 예시는 PostgreSQL 문법으로 포맷됐고, Django는 settings 파일에 지정된 백엔드에 맞춘 SQL을 써요.
모델 사용하기
모델을 정의하고 나면 Django에 그 모델을 쓰겠다고 알려야 해요. settings 파일의 INSTALLED_APPS 설정에 models.py를 담은 모듈 이름을 추가하면 돼요.
INSTALLED_APPS = [
# ...
"myapp",
# ...
]
INSTALLED_APPS에 새 앱을 추가하면 manage.py migrate를 실행해야 해요. 그 전에 마이그레이션을 만들어야 한다면 manage.py makemigrations를 실행하면 돼요.
필드
모델의 가장 중요한 부분이자 유일하게 필수인 부분은 정의하는 데이터베이스 필드 목록이에요. 필드는 클래스 속성으로 지정돼요. 필드 이름이 clean, save, delete 같은 모델 API와 충돌하지 않게 주의해야 해요.
from django.db import models
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
이 예시에서 Album.artist는 ForeignKey로 Musician을 참조해요. on_delete=models.CASCADE는 참조 대상이 삭제될 때 함께 삭제되도록 지정한 거예요. 관계 필드, 필드 타입, 그 외 옵션들은 문서의 이어지는 부분에서 더 자세히 다뤄요.
정리하면, 모델은 "데이터베이스 테이블 하나 = 파이썬 클래스 하나"라고 생각하면 돼요. 클래스 속성으로 필드를 정의하고, INSTALLED_APPS에 등록한 뒤 마이그레이션하면 테이블이 만들어진다는 흐름이 핵심이에요.