Django 모델에서 CharField
나 TextField
의 선택지를 정의할 때, 우리는 흔히 튜플 리스트를 사용해 왔습니다.
하지만 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
는 모델 선택지를 더 직관적이고 견고하게 다룰 수 있게 도와주는 훌륭한 기능입니다.
과거의 튜플 리스트 방식에서 벗어나, 코드 품질을 한 단계 끌어올려 보세요!
Add a New Comment