Django Models 심화: 고급 기능과 실전 활용법 마스터하기

안녕하세요, 여러분! Django Models의 기초를 넘어, 더 깊이 있는 세계로 함께 떠나볼까요? Django를 사용해보신 분들이라면 Models가 얼마나 강력한지 잘 알고 계실 겁니다. 하지만 오늘은 그 기본을 넘어, Django Models 심화 기능들을 살펴보려고 합니다.
커스텀 매니저, 추상 모델, 다중 데이터베이스 활용 등 실전에서 유용한 기술들을 코드 예시와 함께 쉽게 설명드릴게요. 이 포스트를 읽고 나면, 여러분도 Django Models를 마스터할 수 있을 거예요!

1. Django Models 심화: 커스텀 매니저(Custom Manager)
Django에서 기본적으로 제공하는 매니저를 넘어, 커스텀 매니저를 사용하면 더 유연하게 데이터를 조회할 수 있습니다. 예를 들어, 특정 조건을 만족하는 데이터만 조회하는 매니저를 만들어볼까요?

from django.db import models
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
objects = models.Manager() # 기본 매니저
published = PublishedManager() # 커스텀 매니저
def __str__(self):
return self.title코드 해설
class PublishedManager(models.Manager):
- Django의
Manager를 상속받아 커스텀 매니저 클래스를 정의합니다.- 이 클래스는 데이터베이스 조회 시 특정 조건을 적용하여 커스텀 쿼리셋을 반환할 수 있도록 설계되었습니다.
def get_queryset(self):
get_queryset메서드는 쿼리셋을 반환하는 역할을 합니다.return super().get_queryset().filter(status='published')
- 기본 쿼리셋(
super().get_queryset())에 필터를 추가하여status필드 값이'published'인 데이터만 조회하도록 설정합니다.- 이 메서드를 통해 커스텀 매니저가 적용된 모델에서
published상태의 데이터만 선택적으로 관리할 수 있습니다.objects = models.Manager()
- 모델의 기본 매니저를 정의합니다.
objects는 모든 데이터를 포함한 기본 쿼리셋을 제공합니다.- 커스텀 매니저와 함께 사용해 모델에 다양한 데이터 조회 방식을 추가로 제공할 수 있습니다.
published = PublishedManager()
- 커스텀 매니저를 모델에 연결하여
status='published'조건이 적용된 쿼리셋을 반환하는 매니저를 정의합니다.- 이 매니저를 사용하면
Post.published.all()과 같은 방식으로 쉽게 특정 조건에 맞는 데이터를 조회할 수 있습니다.class Post(models.Model):
- 블로그 게시물을 관리하는 모델 클래스입니다.
- 주요 필드는 다음과 같습니다:
title: 게시물의 제목(CharField)으로 최대 길이는 200자입니다.content: 게시물의 본문 내용을 저장하는 필드(TextField)입니다.status: 게시물 상태(draft또는published)를 저장하는 필드입니다.choices옵션으로 가능한 값을 제한합니다.def __str__(self):
- 객체를 문자열로 표현할 때 게시물의 제목(
title)이 반환되도록 설정합니다.- 예를 들어, Django 관리자 페이지나 쉘에서
Post객체를 출력하면 제목이 표시됩니다.
2. Django Models 심화: 추상 모델(Abstract Model)
추상 모델은 여러 모델에서 공통으로 사용되는 필드를 정의할 때 유용합니다. 추상 모델을 상속받는 모델들은 추상 모델의 필드를 자동으로 포함하게 됩니다.

class TimeStampedModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Post(TimeStampedModel):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title코드 해설
class TimeStampedModel(models.Model): 추상 모델 클래스를 정의합니다.created_at = models.DateTimeField(auto_now_add=True): 모델이 생성된 시간을 자동으로 저장합니다.updated_at = models.DateTimeField(auto_now=True): 모델이 업데이트된 시간을 자동으로 저장합니다.class Meta: abstract = True: 이 모델은 추상 모델임을 선언합니다.class Post(TimeStampedModel):TimeStampedModel을 상속받는Post모델을 정의합니다.
3. Django Models 심화: 다중 데이터베이스 활용
Django는 여러 데이터베이스를 동시에 사용할 수 있습니다. 예를 들어, 읽기 전용 데이터베이스와 쓰기 전용 데이터베이스를 분리할 수 있습니다.
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Meta:
db_table = 'user'
using = 'default' # 기본 데이터베이스 사용
class Log(models.Model):
action = models.CharField(max_length=100)
timestamp = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'log'
using = 'logs_db' # 별도의 데이터베이스 사용코드 해설
class User(models.Model):Meta 클래스:
- 사용자 데이터를 관리하기 위한 Django 모델 클래스입니다.
- 주로 사용자 이름과 이메일 정보를 저장합니다.
- 주요 필드는 다음과 같습니다:
name: 최대 100자까지 저장 가능한 문자형 필드(CharField).EmailField), 유효성 검사가 자동으로 적용됩니다.
db_table = 'user':
- 데이터베이스에서 사용할 테이블 이름을
'user'로 설정합니다.- 테이블 이름이 자동으로 생성되는 기본 규칙(
appname_modelname) 대신 지정된 이름을 사용합니다.using = 'default':
- 이 모델은 Django 프로젝트의 기본 데이터베이스(
default)를 사용합니다.
class Log(models.Model):Meta 클래스:
- 로그 데이터를 관리하기 위한 Django 모델 클래스입니다.
- 주요 필드는 다음과 같습니다:
action: 최대 100자까지 저장 가능한 문자형 필드(CharField)로, 특정 작업(예: “login”, “logout”)에 대한 설명을 저장합니다.timestamp: 작업이 발생한 시각을 저장하는 날짜-시간 필드(DateTimeField).
auto_now_add=True: 객체가 처음 생성될 때 현재 시각을 자동으로 저장합니다.
db_table = 'log':
- 데이터베이스에서 사용할 테이블 이름을
'log'로 설정합니다.using = 'logs_db':
- 이 모델은
'logs_db'라는 별도의 데이터베이스를 사용합니다.- 프로젝트의 설정 파일(
settings.py)에서'logs_db'가 정의되어 있어야 합니다.
마무리
이렇게 Django Models의 심화된 기능들을 알아보았습니다. 이제 여러분도 Django Models를 더욱 효과적으로 사용할 수 있을 거예요. 추가로 궁금한 점이 있다면 댓글로 남겨주세요. 함께 공부해봐요! 😊
#용어 해설
- 커스텀 매니저(Custom Manager): 특정 조건에 맞는 데이터만 조회할 수 있도록 커스터마이징된 매니저.
- 추상 모델(Abstract Model): 여러 모델에서 공통으로 사용되는 필드를 정의하는 모델.
- 다중 데이터베이스(Multiple Databases): 하나의 애플리케이션에서 여러 데이터베이스를 동시에 사용하는 기술.






