기초 원리
Pydantic의 핵심 요소는 BaseModel 클래스!
from pydantic import BaseModel
# 잘못된 타입의 값은 못 들어가요
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = 0.0
# 선택적 데이터
item = Item(name="Apple", descriptoin="Red fruit", price=5.5)
# JSON 직렬화
item_json = item.json()
# JSON 역직렬화
item = Item.parse_raw(item_json)
사용자 정의 유효성 검사기 만들기
from pydantic import BaseModel, validator
class User(BaseModel):
name: str
age: int
@validator('age')
def check_age(cls, v):
if v < 18:
raise ValueError('Age must be at least 18')
return v
복잡한 타입과 중첩된 모델 사용하기
from pydantic import BaseModel
from typing import List
class Item(BaseModel):
name: str
description: str = None
price: float
class Order(BaseModel):
id: int
items: List[Item]
order = Order(id=123, items=[{"name": "Apple", "price":5.5}, {"name": "Banana", "price": 3.0}])
ORM 모드
from pydantic import BaseModel
class ORMModel:
def __init__(self, name, age):
self.name = name
self.age = age
class UserModel(BaseModel):
name: str
age: int
class Config:
orm_mode = True
orm_user = ORMModel(name="Alice", age=30)
user = UserModel.form_orm(orm_user)
from urllib import response
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class UserInput(BaseModel):
name: str
age: int
class UserResponse(BaseModel):
name: str
age: int
is_adult: bool
@app.post("/user/", response_model=UserResponse)
def create_user(user: UserInput):
# 입력 받은 데이터를 처리
is_adult = user.age >= 18
# 응답 모델을 사용하여 응답ㄷ 데이터를 구성
response_data = UserResponse(
name = user.name,
age = user.age,
is_adult = is_adult
)
return response_data
→ velidator 때문에 함수가 실제 반환하는 데이터와의 일관성을 주의 해야 함. 밸리데이터가 별도로 정의 된다는 것을 명확히 해줘야 불일치성 발생을 방지 할 수 있음.