일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- docker
- dockerfile
- BAEKJOON
- 백준
- 이더리움
- 알고리즘
- 블록체인
- IMAGE
- Network
- AWS
- function
- Refactoring
- Algorithm
- guru
- Container
- 전문가를 위한 파이썬
- Ethereum
- 러스트
- Thread
- BlockChain
- fluent python
- 동시성
- RabbitMQ
- Python
- 플랫폼
- Kubernetes
- Fast API
- 코어 이더리움 프로그래밍
- 파이썬
- rust
Archives
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
[4] Pydantic Model 본문
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
- user_in 객체는 Pydantic models 임
- Pydantic models은 .dict()라는 함수가 있으며, model data를 dict로 리턴함
user_dict = user_in.dict()
{
'username': 'john',
'password': 'secret',
'email': 'john.doe@example.com',
'full_name': None,
}
- dict를 unwrapping 하는 방법 →
**user_dict
라고 쓰면, python은 dict를 다 까서 각 키와 벨류를 전달함- 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
'Python > Fast API' 카테고리의 다른 글
[6] Middleware, Background Tasks, Sub Application in Fast API (0) | 2021.07.30 |
---|---|
[5] Dependency Injection이란? in Fast API (0) | 2021.07.22 |
[3] Fast API Basic - Response 편 (0) | 2021.07.20 |
[2] Fast API Basic - Request 편 (2) | 2021.07.20 |
[1] Fast API로 한걸음! (0) | 2021.07.19 |
Comments