개발로 자기계발
article thumbnail
Published 2022. 12. 24. 15:05
FastAPI Response Model - 25 Develop/FastAPI
728x90
rating이 없는 dict 값 반환이 목표

1. 새로운 BaseModel 생성

class BookNoRating(BaseModel):
    id: UUID
    title: str = Field(min_length=1)
    author: str
    description: Optional[str] = Field(
        None,
        title='Description of the Book',
        max_length=100,
        min_length=1
    )

 

2. 새로운 함수 생성(response_model 정의)

@app.get("/book/rating/{book_id}", response_model=BookNoRating)
async def read_book_no_rating(book_id:UUID):
    for x in BOOKS:
        if x.id == book_id:
            return x
    raise raise_item_cannot_he_found_exception()
  • BOOKS list안에 book_id와 같은 UUID가 있으면 x 값 return
  • BOOKS list안의 dict는 rating을 포함하고 있지만 response_model을 BookNoRating으로 정의했기 때문에 rating이 제외된 결과를 얻을 수 있게 되었음.
  • 없다면 사전에 정의한 에러 함수 return 
response_model 장점

1. output 데이터를 선언한 타입에 맞게 컨버팅
2. 데이터 유효성 검사
3. JSON 직렬화
4. automatic documenting
5. 모델의 결과 데이터를 제한

 

3. 종합 정리

  • BOOKS list 안의 dict 구조(Book BaseModel을 바라보고 있음)
BOOKS = []

book_1 = Book(id="db6d5c1f-0460-4bab-8aa1-a801bf843273",
                  title="Title 1",
                  author="Author 1",
                  description="Description 1",
                  rating=75)
  • BaseModel 차이
class Book(BaseModel):
    id: UUID
    title: str = Field(min_length=1)
    author: str = Field(min_length=1, max_length=100)
    description: Optional[str] = Field(title="Description of the book",
                             max_length=100,
                             min_length=1)
    rating: int = Field(gt=-1, lt=101)
    

class BookNoRating(BaseModel):
    id: UUID
    title: str = Field(min_length=1)
    author: str
    description: Optional[str] = Field(
        None,
        title='Description of the Book',
        max_length=100,
        min_length=1
    )
  • 함수 차이
@app.get("/book/{book_id}")
async def read_book(book_id:UUID):
    for x in BOOKS:
        if x.id == book_id:
            return x
            
            
@app.get("/book/rating/{book_id}", response_model=BookNoRating)
async def read_book_no_rating(book_id:UUID):
    for x in BOOKS:
        if x.id == book_id:
            return x
    raise raise_item_cannot_he_found_exception()

 

4. Swagger 확인

왼쪽: Book BaseModel / 오른쪽: BookNoRating BaseModel

BOOKS list의 dict 값을 가져오는데 response_model을 rating이 없는 BaseModel로 사전에 정의 했기 때문에 GET 요청 간 rating이 빠진 상태로 BookNoRating의 BaseModel 형식으로 데이터를 return 받게 되는 것을 볼 수 있음.
728x90
SMALL

'Develop > FastAPI' 카테고리의 다른 글

FastAPI Form Fields - 27  (0) 2022.12.24
FastAPI Status Code Response - 26  (0) 2022.12.24
FastAPI Raise HTTP Exception(사용자 지정) - 24  (0) 2022.12.24
FastAPI Raise HTTP Exception - 23  (0) 2022.12.24
FastAPI Delete Request - 22  (0) 2022.12.23
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)