본문 바로가기
Fastapi

FastAPI 자습서 스터디 기록 (Multiple Parameters, Nested Models)

by Django_ 2022. 6. 12.
반응형

다수의 파라미터를 사용하려면 아래와 같이 BaseModel을 상속받아 만들면 됩니다.

Django의 forms와 비슷하다고 생각이 듭니다.

해당 코드는 테스트를 위한 코드이기때문에 한 페이지에 표시 되었지만,

구조를 정해서 해당 구조에 맞게 관리하는것이 유지보수를 높일 수 있는 방법이지 않을까 합니다.

from typing import Union

from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None


class User(BaseModel):
    username: str
    full_name: Union[str, None] = None


@app.put("/items/{item_id}")
async def update_item(
    *,
    item_id: int,
    item: Item,
    user: User,
    importance: int = Body(gt=0),
    q: Union[str, None] = None
):
    results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
    if q:
        results.update({"q": q})
    return results

필드를 사용하여 데이터 검증과 메타데이터, 옵션등을 설정할 수 있습니다.

price: float = Field(gt=0, description="The price must be greater than zero")

Nested Models

 

작업을 진행 하다보면 리스트 데이터를 받아야하는 경우가 상당히 많습니다.

아마 기존에는 아래와 같은 방식을 생각했을것 같습니다.

class Item(BaseModel):
    tags: list = []

이제는 typing 을 import 하여 데이터 형식 삽입까지 설정 할 수 있습니다

from typing import List

class Item(BaseModel):
    tags: List[str] = []
    # 3.9 and above
    # my_list: list[str]

이렇게 설정하게 되면 리스트 검증과 데이터의 str 검증까지 할 수 있게 됩니다.

 

Nested Models 역시 submodel을 호출하여 사용할 수 있습니다.

class Image(BaseModel):
    url: str
    name: str


class Item(BaseModel):
    name: str
    images: Union[List[Image], None] = None

 

그리고 더욱 복잡한 Nested Models 도 아래와 같이 생성할 수 있습니다.

class Image(BaseModel):
    url: HttpUrl
    name: str


class Item(BaseModel):
    name: str
    description: Union[str, None] = None
    images: Union[List[Image], None] = None


class Offer(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    items: List[Item]

추가 데이터 타입은 pydanic에서 확인하실 수 있습니다

UUID:
datetime.datetime:
datetime.date:
datetime.time:
datetime.timedelta:
frozenset:
bytes:
Decimal:

 

반응형

댓글