Python (with. Code)/Django-ninja

[Django Ninja] API Docs에서 Enum 드롭 다운 표시하기

yubi5050 2023. 4. 9. 17:07

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 확인

(왼쪽) api/docs 입력 창 / (오른쪽) django admin 입력 창