API Docs에서 Drop down 선택형 구현하기
Django Ninja에서 기본적으로 제공하는 API Docs에서 dropdown 형태의 Enum 선택이 제공되면 편할 것 같아 찾아 보던 중
기존 Django의 enum을 상속 받는 Choices 모듈이 존재하였다.
- 해당 Choices 모듈을 원하는 성격에 맞춰 (ex. TextChoices, IntChoices 등) 작성 후에 model에 선언하였고,
- 해당 Schema에서 Choices의 형태를 받도록 구현하였다.
- 실제 DB에 저장되는 값은, CharField로 선언하였기에 문자열로 저장된다. (ex. InProgress)
- Choice에 등록되지 않은 값 추가시 에러가 발생한다.
(추가) Choices 는 언제 써야 할까?
코드의 유연성을 굳이 고려할 필요가 없을 때
- admin에서 어떤 카테고리 값을 직접 Custom 불가능 할 때
- 수정시 로직에 사이드 이펙트가 가해져, 코드가 수정이 필요해질 때는 부적절
- ex. 상태값
API Docs 에서 편의성을 위해
- API Docs 값 입력시 enum 형태 등으로 편하게 제공됨
확장성이 필요할 카테고리의 경우에는 사용 하지 않는 것이 적절
- choices 필드로 값이 제한되어 에러가 발생 할 수 있음
코드
# models.py
class Status(models.Model):
class StatusEnum(models.TextChoices):
InProgress = "InProgress" # DB 저장값 = 노출값
Completed = "Completed"
Canceled = "Canceled"
InActive = "InActive"
status = models.CharField(
verbose_name="상태", choices=StatusEnum.choices, max_length=20
)
# schemas_in.py
class StatusIn(Schema):
status: Status.StatusEnum = Status.StatusEnum.InProgress
# api.py
from ninja import Query
@router.post("/campaign/")
def post_status(request, payload:StatusIn=Query(...)):
st = Status.objects.create(**payload.dict())
st.save()
return 'Success'
API Docs, Admin 확인
'Python > Django Ninja' 카테고리의 다른 글
[Django Ninja] GIS 데이터 처리 관련 정리 (0) | 2023.05.24 |
---|---|
[Django Ninja] 정참조, 역참조 Schema 구현 (0) | 2023.04.29 |
[Django Ninja] 커스텀 Pagination 모듈 구현기 (0) | 2023.04.16 |
[Django Ninja] Schema 비교 (Schema, ModelSchema, CreateSchema) (0) | 2023.02.27 |
[Django Ninja] Django Ninja 프레임워크란? (with. Boiler Plate) (0) | 2023.02.26 |