vindevs: how to use django field choices with code examples
상황에 따른 choices 사용 구분
- Django 모델의
choices에 쓸 거면 → models.TextChoices ✅
- 내부 로직에서만 쓸 상수면 →
enum.Enum 또는 StrEnum ✅
- Python 3.11 이상이라면
StrEnum도 고려 가능 (문자열 비교 안전성 증가)
Model 의 Choices 에서 사용되는 예시
- Model 정의 시에 특정 Field가 정해진 옵션들만 가질 수 있는 경우 (job_status)
choices 에 해당 옵션들을 넣게 된다.
from django.db import models
from common.choices import JobStatus
class Job(models.Model):
file = models.ForeignKey('file.File', null=False, on_delete=modles.CASCADE, verbose_name='파일 ID', related_name='job2file')
...
job_status = models.CharField(choices=JobStaus.choices, max_length=4, default=JobStatus.Initial, verbose_name='작업 상태')
- common 앱 내부에 choices.py 파일을 만들어서 다음과 같이
model.TextChoices를 추가 할 수 있다.
choices.py로 구조분리 함으로써 가독성 높이기
from django.db import models
class JobStatus(modles.TextChoices):
Initial = 'JS01', '초기'
Complete = 'JS02', '완료'
Reject = 'JS03', '반려'
status = modles.CharField(
max_length=4,
choices=JobStatus.choices,
default=JobStatus.Initial,
)
결론
CharField나 TextField에서 choices= 옵션에 연결할 값이면 무조건 models.TextChoices.