Victoree's Blog

[4] Pydantic Model 본문

Python/Fast API

[4] Pydantic Model

victoree 2021. 7. 22. 13:58
728x90

1.Model Dict

1) wrapping/unwrapping

@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):
    user_saved = fake_save_user(user_in)
    return user_saved
  1. user_in 객체는 Pydantic models
  2. Pydantic models은 .dict()라는 함수가 있으며, model data를 dict로 리턴함
user_dict = user_in.dict()

{
    'username': 'john',
    'password': 'secret',
    'email': 'john.doe@example.com',
    'full_name': None,
}
  1. dict를 unwrapping 하는 방법 → **user_dict 라고 쓰면, python은 dict를 다 까서 각 키와 벨류를 전달함
    1. UserInDB(user_dict)**

2) exclude_unset

  • item.dict(exclude_unset=True)
  • request에서 받은 요청중에 특정 아이템의 default 설정값을 제외한 입력값만 추려서 dict를 구성해줌
@app.patch("/items/{item_id}", response_model=Item)
async def update_item(item_id: str, item: Item):
    stored_item_data = items[item_id]
    stored_item_model = Item(**stored_item_data)
    update_data = item.dict(exclude_unset=True)
    updated_item = stored_item_model.copy(update=update_data)
    items[item_id] = jsonable_encoder(updated_item)
    return updated_item

 

2. Encoding

  • DB에서 JSON 호환가능한 데이터만 받는다고 가정
    • datetime object → ISO format으로 converting 해야함
  • from fastapi.encoders import **jsonable_encoder**
    • JSON 형식의 데이터를 포함하는 큰 str을 리턴하는 게 아니라, python 표준 데이터 구조인 dict를 반환함

 

3. Reduce Duplication

  • 모델 상속으로 코드 중복을 피할 수 있음
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel, EmailStr

app = FastAPI()

class UserBase(BaseModel):
    username: str
    email: EmailStr
    full_name: Optional[str] = None

class UserIn(UserBase):
    password: str

class UserOut(UserBase):
    pass

class UserInDB(UserBase):
    hashed_password: str

def fake_password_hasher(raw_password: str):
    return "supersecret" + raw_password

def fake_save_user(user_in: UserIn):
    hashed_password = fake_password_hasher(user_in.password)
    user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password)
    print("User saved! ..not really")
    return user_in_db

@app.post("/user/", response_model=UserOut)
async def create_user(user_in: UserIn):
    user_saved = fake_save_user(user_in)
    return user_saved
728x90
Comments