Fast API, Body - Nested Models

Junha Kim·2021년 1월 6일
0

FastAPI

목록 보기
11/16
post-custom-banner

Pydantic 모델을 이용하여 Nested Model도 구현할 수 있다.


List Fields

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: list = []

tags는 어떠한 자료형이든 담을 수 있는 list가 된다.

from typing import List, Optional

tags: List[str] = []

위와 같이 typing에서 List를 import하여 List[str]과 같이 쓰면, str만이 요소가 되는 리스트가 된다.


Set

Set 또한 내부 요소를 제한할 수 있다.

from typing import Optional, Set

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: Set[str] = set()

Nested Models

Pydantic으로 정의한 모델 또한 하나의 자료형이 되기에 다른 Pydantic 모델의 type hint에 쓰일 수 있다.

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

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: Set[str] = []
    image: Optional[Image] = None

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    results = {"item_id": item_id, "item": item}
    return results

먼저 정의된 Image모델이 Item모델의 item변수의 type으로 쓰이는 경우이다.

이렇게 되면 아래와 같은 구조의 body가 들어와야한다.

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2,
    "tags": ["rock", "metal", "bar"],
    "image": {
        "url": "http://example.com/baz.jpg",
        "name": "The Foo live"
    }
}

Deeper Nested Model

더 깊게 해본다면 아래와 같이 할 수 있다.

from typing import List, Optional, Set

from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()

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

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
    tags: Set[str] = set()
    images: Optional[List[Image]] = None

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

Offer.items 안에 Item객체 리스트가 있고, Item.images 안에 Image객체 리스트가 있는 구조이다.


Special Types and Validation

URL을 저장하고 싶을 때는 HttpUrl이라는 type이 pydantic모듈에 있다.

from typing import Optional, Set

from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()

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

더 많은 type들을 보고 싶다면 여기로 가면 된다.

post-custom-banner

0개의 댓글