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

Django Models 심화 기능 참고 이미지1

안녕하세요, 여러분! Django Models의 기초를 넘어, 더 깊이 있는 세계로 함께 떠나볼까요? Django를 사용해보신 분들이라면 Models가 얼마나 강력한지 잘 알고 계실 겁니다. 하지만 오늘은 그 기본을 넘어, Django Models 심화 기능들을 살펴보려고 합니다.

커스텀 매니저, 추상 모델, 다중 데이터베이스 활용 등 실전에서 유용한 기술들을 코드 예시와 함께 쉽게 설명드릴게요. 이 포스트를 읽고 나면, 여러분도 Django Models를 마스터할 수 있을 거예요!

Django Models 심화 기능 참고 이미지1

1. Django Models 심화: 커스텀 매니저(Custom Manager)

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

커스텀 매니저(Custom Manager) 이미지
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)

추상 모델은 여러 모델에서 공통으로 사용되는 필드를 정의할 때 유용합니다. 추상 모델을 상속받는 모델들은 추상 모델의 필드를 자동으로 포함하게 됩니다.

추상 모델(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'  # 별도의 데이터베이스 사용

코드 해설

  1. class User(models.Model):
    • 사용자 데이터를 관리하기 위한 Django 모델 클래스입니다.
    • 주로 사용자 이름과 이메일 정보를 저장합니다.
    • 주요 필드는 다음과 같습니다:
      • name: 최대 100자까지 저장 가능한 문자형 필드(CharField).
      • email: 이메일 주소를 저장하는 필드(EmailField), 유효성 검사가 자동으로 적용됩니다.
    Meta 클래스:
    • db_table = 'user':
      • 데이터베이스에서 사용할 테이블 이름을 'user'로 설정합니다.
      • 테이블 이름이 자동으로 생성되는 기본 규칙(appname_modelname) 대신 지정된 이름을 사용합니다.
    • using = 'default':
      • 이 모델은 Django 프로젝트의 기본 데이터베이스(default)를 사용합니다.

  1. class Log(models.Model):
    • 로그 데이터를 관리하기 위한 Django 모델 클래스입니다.
    • 주요 필드는 다음과 같습니다:
      • action: 최대 100자까지 저장 가능한 문자형 필드(CharField)로, 특정 작업(예: “login”, “logout”)에 대한 설명을 저장합니다.
      • timestamp: 작업이 발생한 시각을 저장하는 날짜-시간 필드(DateTimeField).
        • auto_now_add=True: 객체가 처음 생성될 때 현재 시각을 자동으로 저장합니다.
    Meta 클래스:
    • db_table = 'log':
      • 데이터베이스에서 사용할 테이블 이름을 'log'로 설정합니다.
    • using = 'logs_db':
      • 이 모델은 'logs_db'라는 별도의 데이터베이스를 사용합니다.
      • 프로젝트의 설정 파일(settings.py)에서 'logs_db'가 정의되어 있어야 합니다.

마무리

이렇게 Django Models의 심화된 기능들을 알아보았습니다. 이제 여러분도 Django Models를 더욱 효과적으로 사용할 수 있을 거예요. 추가로 궁금한 점이 있다면 댓글로 남겨주세요. 함께 공부해봐요! 😊

#용어 해설

  1. 커스텀 매니저(Custom Manager): 특정 조건에 맞는 데이터만 조회할 수 있도록 커스터마이징된 매니저.
  2. 추상 모델(Abstract Model): 여러 모델에서 공통으로 사용되는 필드를 정의하는 모델.
  3. 다중 데이터베이스(Multiple Databases): 하나의 애플리케이션에서 여러 데이터베이스를 동시에 사용하는 기술.

유사한 게시물