본문 바로가기
Fastapi

FastAPI 자습서 스터디 기록 (Extra Models)

by Django_ 2022. 6. 14.
반응형

Extra Models의 경우 더 섬세한 입출력 검증위해 사용한다고 생각하시면 됩니다.

이때 중복도 감소하게 되어 클린한 코드를 유지할 수 있습니다..

흔히 Python을 사용 해본사람은 알 수 있는 자료형들입니다.

  • UUID:
  • datetime.datetime:
    • 파이썬의 datetime.datetime (2022-06-15T15:53:00+09:00)
  • datetime.date:
    • 파이썬의 datetime.date. (2022-06-15)
  • datetime.time:
    • 파이썬의 datetime.time. (18:20:00.123)
  • datetime.timedelta:
    • 파이썬의 datetime.timedelta.
  • Decimal:
    • 파이썬의 Decimal.

 

아래 코드와 같이 중복되는 것을 선언하고 상속을 받아 또 다른 model을 생설할 수 있습니다.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class BaseItem(BaseModel):
    description: str
    type: str


class CarItem(BaseItem):
    type = "car"


class PlaneItem(BaseItem):
    type = "plane"
    size: int


items = {
    "item1": {"description": "All my friends drive a low rider", "type": "car"},
    "item2": {
        "description": "Music is my aeroplane, it's my aeroplane",
        "type": "plane",
        "size": 5,
    },
}


@app.get("/items/{item_id}", response_model=Union[PlaneItem, CarItem])
async def read_item(item_id: str):
    return items[item_id]

각각 Response body를 보면 어떻게 동작하는지 명확하게 알 수 있습니다.

# items/item1
{
  "description": "All my friends drive a low rider",
  "type": "car"
}


# items/item2
{
  "description": "Music is my aeroplane, it's my aeroplane",
  "type": "plane",
  "size": 5
}

그렇다면 type 필드를 제외하거나 모델에 type에 정의되지 않은 값을 넣으면 어떻게 보여질까요?

items = {
    #"item1": {"description": "All my friends drive a low rider", "type": "car"},
    #"item2": {
    #    "description": "Music is my aeroplane, it's my aeroplane",
    #    "type": "plane",
    #    "size": 5,
    #},
    "item3": {
        "description": "Music is my aeroplane, it's my aeroplane",
        "size": 5,
    },
    "item4": {
        "description": "Music is my aeroplane, it's my aeroplane",
    },
    "item5": {
        "description": "Music is my aeroplane, it's my aeroplane",
        "type": "empty type",
    }
}

각각 호출하였을때 Response Body 값입니다.

# /items/item3

{
  "description": "Music is my aeroplane, it's my aeroplane",
  "type": "plane",
  "size": 5
}

# /items/item4

{
  "description": "Music is my aeroplane, it's my aeroplane",
  "type": "car"
}

# /items/item5

{
  "description": "Music is my aeroplane, it's my aeroplane",
  "type": "empty type"
}

item5의 경우 예상을 한대로 str을 전달받아 노출이 되었습니다.

type이 지정되지 않은 item4의 경우 default로 정의된 car가 들어갔습니다.

item3의 경우 size가 포함되어있으니 plane으로 호출된것을 확인 할 수 있습니다.

반응형

댓글