django

Django Model

bitandwon 2026. 6. 29. 13:36

Django Model이란?

Django Model은 데이터베이스 테이블을 Python 클래스로 표현하는 기능입니다. 모델을 정의하면 Django ORM이 이를 기반으로 테이블을 생성하고 데이터를 객체처럼 다룰 수 있도록 지원합니다.

즉, SQL을 직접 작성하지 않아도 Python 코드만으로 데이터베이스를 제어할 수 있는 것이 Django Model의 가장 큰 장점입니다.

Model의 기본 구조

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

위 모델은 Post 테이블을 생성하며 제목, 내용, 작성일 필드를 포함합니다.

 

자주 사용하는 Field 종류

필드 설명 사용 예시
CharField 짧은 문자열 제목, 이름
TextField 긴 문자열 본문
IntegerField 정수 나이, 조회수
BooleanField 참/거짓 공개 여부
DateTimeField 날짜 및 시간 작성일
EmailField 이메일 회원 이메일
ImageField 이미지 파일 프로필 사진
FileField 파일 업로드 첨부파일

Field 옵션 이해하기

title = models.CharField(
    max_length=100,
    unique=True,
    null=False,
    blank=False
)
옵션 설명
max_length 최대 길이
unique 중복 허용 여부
null DB에서 NULL 허용
blank 폼 입력 허용 여부
default 기본값
choices 선택 가능한 값 지정

ForeignKey 관계

하나의 작성자가 여러 게시글을 작성할 수 있는 1:N 관계입니다.

class Author(models.Model):
    name = models.CharField(max_length=50)

class Post(models.Model):
    author = models.ForeignKey(
        Author,
        on_delete=models.CASCADE
    )
    title = models.CharField(max_length=100)

ForeignKey는 가장 많이 사용하는 관계 설정 방식입니다.

OneToOneField 관계

회원과 프로필처럼 1:1 관계를 표현할 때 사용합니다.

class Profile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE
    )

ManyToManyField 관계

게시글과 태그처럼 N:M 관계를 표현할 때 사용합니다.

class Tag(models.Model):
    name = models.CharField(max_length=30)

class Post(models.Model):
    tags = models.ManyToManyField(Tag)
관계 사용 예시
OneToOne 회원 - 프로필
ForeignKey 작성자 - 게시글
ManyToMany 게시글 - 태그

Meta 클래스 사용하기

테이블 이름, 정렬 방식 등 모델의 동작을 설정할 수 있습니다.

class Meta:
    db_table = "posts"
    ordering = ["-created_at"]
    verbose_name = "게시글"
    verbose_name_plural = "게시글 목록"

Model 메서드 작성

모델 안에 비즈니스 로직을 포함할 수 있습니다.

class Post(models.Model):
    title = models.CharField(max_length=100)

    def is_long_title(self):
        return len(self.title) > 30

이처럼 모델에 자주 사용하는 기능을 메서드로 정의하면 코드 재사용성이 높아집니다.

마이그레이션 이해하기

모델을 수정한 후에는 변경 사항을 데이터베이스에 반영해야 합니다.

python manage.py makemigrations

python manage.py migrate
명령어 설명
makemigrations 변경 사항 감지
migrate DB에 반영
showmigrations 적용 여부 확인

관리자(Admin)에 모델 등록

from django.contrib import admin
from .models import Post

admin.site.register(Post)

관리자 페이지에서 데이터를 쉽게 관리할 수 있습니다.

실무에서 많이 사용하는 Model 설계 팁

  • 공통 필드는 추상(Abstract) 모델로 분리합니다.
  • created_at, updated_at 필드를 기본으로 추가합니다.
  • 적절한 인덱스를 설정하여 조회 성능을 향상시킵니다.
  • 필수 값에는 null=False를 유지해 데이터 무결성을 확보합니다.
  • related_name을 지정해 역참조 이름을 명확하게 관리합니다.

초보자가 자주 하는 실수

  • 모델 수정 후 마이그레이션을 실행하지 않음
  • null과 blank의 차이를 혼동함
  • 관계 설정에서 on_delete 옵션을 잘못 선택함
  • 문자열 길이를 고려하지 않고 CharField를 정의함
  • 비즈니스 로직을 View에만 작성하여 재사용성이 떨어짐
실무 팁: 초기 모델 설계 단계에서 관계와 필드 옵션을 충분히 검토하면 이후 데이터베이스 변경과 마이그레이션 부담을 크게 줄일 수 있습니다.

정리

Django Model은 데이터 구조를 정의하는 핵심 요소입니다. 필드 타입과 옵션을 올바르게 이해하고, 관계 설정과 Meta 클래스, 모델 메서드를 적절히 활용하면 확장성과 유지보수성이 높은 애플리케이션을 만들 수 있습니다. 이후에는 ORM 심화, QuerySet 최적화, 인덱스 설계, 트랜잭션 처리까지 학습하면 실무 프로젝트에서도 안정적인 데이터 모델을 설계할 수 있습니다.

FAQ

Q1. null과 blank의 차이는 무엇인가요?

null은 데이터베이스에서 NULL을 허용하는 옵션이며, blank는 Django 폼에서 빈 값을 허용하는 옵션입니다.

Q2. ForeignKey와 ManyToManyField는 어떻게 선택하나요?

한 작성자가 여러 게시글을 작성하는 구조는 ForeignKey, 하나의 게시글에 여러 태그를 연결하는 구조는 ManyToManyField를 사용합니다.

Q3. 모델을 수정하면 자동으로 데이터베이스가 변경되나요?

아니요. makemigrations와 migrate 명령을 실행해야 변경 사항이 반영됩니다.

Q4. __str__() 메서드는 왜 필요한가요?

관리자 페이지와 Django Shell에서 객체를 사람이 읽기 쉬운 형태로 표시하기 위해 사용합니다.

Q5. Model과 ORM은 어떤 관계인가요?

Model은 데이터 구조를 정의하고, ORM은 정의된 모델을 기반으로 데이터베이스와 상호작용하는 역할을 담당합니다.

'django' 카테고리의 다른 글

Django settings.py  (0) 2026.07.10
Django 프로젝트 구조  (0) 2026.07.10
Django ORM  (0) 2026.06.29
Django CRUD  (0) 2026.06.29
Django 기본 문법 총정리: 초보자를 위한 핵심 개념과 실전 예제  (0) 2026.06.29