Django 모델에서 CharFieldTextField의 선택지를 정의할 때, 우리는 흔히 튜플 리스트를 사용해 왔습니다.
하지만 Django 3.0부터 도입된 TextChoices를 활용하면 훨씬 더 깔끔하고, 의미 있는 코드 작성이 가능합니다.


1. 모델 선택지 정의: 전통 방식

우리가 쉽게 쓰는 방식은 아래와 같이 튜플 리스트 방식입니다.

# models.py
STATUS_CHOICES = [
    ('DF', 'Draft'),
    ('PB', 'Published'),
    ('AR', 'Archived'),
]

class Post(models.Model):
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='DF')

전통 방식의 단점: - 코드 의미 파악이 어려움 ('DF'가 뭔지 바로 알기 힘듬) - get_FIELD_display()를 쓰긴 하지만, Enum 스타일로 구조화되지 않아서 유지보수에 불편 - 조건 비교 등에서 하드코딩이 필요함

if post.status == 'DF':
    ...

2. TextChoices 방식으로 개선


소스코드를 보면 원리는 간단하니, 작동원리가 궁금한 분들은 Django 의 소스코드로 들어가 보길 권합니다.
여기서는 단순히 사용법에 대해서만 설명하고자 합니다.

# models.py 내부
from django.db import models

class PostStatus(models.TextChoices):
    DRAFT = 'DF', 'Draft'
    PUBLISHED = 'PB', 'Published'
    ARCHIVED = 'AR', 'Archived'

class Post(models.Model):
    status = models.CharField(max_length=2, choices=PostStatus.choices, default=PostStatus.DRAFT)

이 방식의 장점: - PostStatus.DRAFT처럼 의미 있는 이름으로 조건 처리 가능 - get_status_display() 완벽 지원 - enum처럼 객체 취급 가능하여 IDE 자동완성, 정적 분석도 유리

if post.status == PostStatus.DRAFT:
    ...
  • 재사용성: 여러 모델에서 같은 선택지를 공유해야 한다면 외부 파일(choices.py)에 정의하면 됨

사실상 재사용성이 이 TextChoice클래스를 쓰는 가장 큰 장점이라고 생각됩니다. Django의 여러 App에서 공통으로 사용하는 선택지라면 commons/choices.py등에 넣어두고 어느 앱에서든 선택지를 불러쓸 수 있기 때문입니다.


3. 결론


Django의 TextChoices는 모델 선택지를 더 직관적이고 견고하게 다룰 수 있게 도와주는 훌륭한 기능입니다.
과거의 튜플 리스트 방식에서 벗어나, 코드 품질을 한 단계 끌어올려 보세요!