728x90
반응형

FastAPI를 사용하면 (Pydantic에 의해), 임의로 깊게 중첩된 모델을 정의, 유효성 검사, 문서화할 수 있습니다.

 

리스트 필드

어트리뷰트를 서브타입으로 정의할 수 있습니다. 예를 들어, 파이썬의 list 입니다:

 

 

이것은 tags 를 리스트의 아이템으로 만들어줍니다. 그럼에도 불구하고 개별 아이템에 대한 자료형을 선언하지는 않습니다.

 

자료형 매개변수를 사용한 리스트 필드

그러나 파이썬은 특정 방법을 통해 내부 자료형, 또는 "자료형 매개변수"와 함께 리스트를 선언할 수 있습니다.

 

타이핑의 List 임포트

우선, 표준 파이썬의 typing 모듈로부터 List 를 임포트하시기 바랍니다:

 

 

자료형 매개변수로 List 선언

list , dict , tuple 과 같은 자료형 매개변수(내부 자료형) 을 가진 자료형을 선언하기 위해서는:

 

  • typing 모듈로부터 그것들을 임포트 하시기 바랍니다.
  • 대괄호: [] 를 사용하여 내부 자료형을 "자료형 매개변수"로써 전달하시기 바랍니다.

 

 

이것은 전부 자료형 선언에 대한 표준 파이썬 문법입니다.

 

동일한 표준 문법을 내부 자료형을 사용하여 모델 어트리뷰트에도 사용하시기 바랍니다.

 

결론적으로, 우리의 예시에서, tags 를 "문자열들의 리스트"로 특정지어 만들 수 있습니다:

 

 

타입 설정

그러나 태그는 유일무이한 문자열로 반복되지 않아야 한다는 걸 깨닫게 됩니다.

 

그리고 파이썬은 유일무이한 아이템들의 집합을 위한 특별한 데이터 자료형으로, set 을 갖고 있습니다.

 

따라서 Set 을 임포트하고 tagsstrset 으로써 선언할 수 있습니다:

 

 

이것을 사용하면, 만약 중복된 데이터 요청을 받더라도, 유일무이한 요소들의 집합으로 전환됩니다.

 

그리고 데이터를 내보낼 때, 만약 데이터가 중복되더라도, 유일무이한 집합으로 내보내집니다.

 

그리고 이에 따라 주석이 달리고 / 문서화 됩니다.

 

중첩 모델

각각의 Pydantic 모델의 어트리뷰트는 자료형을 갖고 있습니다.

 

그러나 그 자료형은 스스로 또다른 Pydantic 모델이 될 수 있습니다.

 

따라서, 특정한 어트리뷰트 이름, 자료형 그리고 유효성 검사를 가진 깊게 중첩된 JSON "객체"를 선언할 수 있습니다.

 

이것들은 모두, 임의적으로 중첩되어 있습니다.

 

서브모델 선언

예를 들어, Image 모델을 다음과 같이 정의할 수 있습니다:

 

 

서브모델을 자료형으로 사용

그리고 이것을 어트리뷰트의 자료형으로 사용할 수 있습니다:

 

 

이것은 FastAPI가 아래와 유사한 바디를 예상한다는 의미입니다:

 

 

다시 한 번, FastAPI를 활용한, 이러한 선언을 통해 아래와 같은 효과를 얻을 수 있습니다.

 

  • 중첩 모델에 대한 편집기 지원 (완성 기능, 기타 등등)
  • 데이터 전환
  • 데이터 유효성 검사
  • 자동 문서화

 

특별한 자료형과 유효성 검사

str , int , float , 등과 같은 보통의 단일 자료형이 아닌 str 로 부터 상속 받는 더 복잡한 단일 자료형을 사용할 수 있습니다.

 

사용할 수 있는 옵션을 모두 보려면, Pydantic의 특이한 자료형 을 확인하시기 바랍니다. 다음 챕터에서 몇 가지 예시를 확인할 수 있습니다.

 

예를 들어, Image 모델 내에 url 필드가 있을 경우, str 대신 Pydantic의 HttpUrl 로 선언할 수 있습니다:

 

 

문자열은 유효한 URL인지 확인되고, JSON 스키마 / OpenAPI 등에 문서화 됩니다.

 

서브모델의 리스트를 사용한 어트리뷰트

또한 Pydantic 모델을 list , set 기타 등등의 서브자료형으로 사용할 수 있습니다:

 

 

이것은 아래와 같이 JSON 바디를 예상 (전환, 유효성 검사, 문서화, 기타 등등) 합니다:

 

 

정보

images 의 키가 이제 이미지 객체의 리스트를 어떻게 갖는지 명심하시기 바랍니다.

 

깊이 중첩된 모델

임의의 깊이 중첩된 모델을 정의할 수 있습니다:

 

 

정보

Offer 가 어떻게 Image 를 선택적 리스트로 갖는, Item 를 리스트로 갖는지 명심하시기 바랍니다.

 

순수한 리스트들의 바디

예상하는 JSON 바디의 최상위 값이 만약 JSON array (파이썬 list )라면, Pydantic 모델과 동일한 방법으로, 함수의 매개변수 속 자료형을 선언할 수 있습니다:

 

 

이는 아래와 같습니다:

 

 

어디서나 가능한 편집기 지원

그리고 어디서나 편집기의 지원을 받을 수 있습니다.

 

리스트 내부의 아이템도 아래와 같이 가능합니다:

 

 

만약 Pydantic 모델 대신에 곧바로 dict 을 사용하여 작업할 경우 당신은 이러한 편집기 지원을 받을 수 없습니다.

 

그러나 이것을 걱정할 필요 또한 없습니다. 들어온 딕셔너리는 자동적으로 전환되고 결괏값 또한 JSON으로 자동 전환됩니다.

 

임의 dict 의 바디

또한 어떤 자료형의 키와 다른 자료형의 값으로 구성된 dict 을 바디에 선언할 수 있습니다.

 

유효한 필드/어트리뷰트 이름을 (Pyndatic 모델 처럼) 미리 알아야 할 필요가 없습니다.

 

이것은 모르는 키를 수신하고 싶은 상황에 도움이 될 것입니다.

 


 

다른 유용한 경우는 int 와 같은 다른 자료형의 키를 원할 때입니다.

 

이러한 경우를 한 번 살펴보고자 합니다.

 

이 경우, float 값과 int 키를 갖고 있으면 어떤 dict 이더라도 허용할 수 있습니다.

 

 



JSON이 키로 오직 str 만 지원한다는 걸 명심하시기 바랍니다.

그러나 Pydantic은 자동으로 데이터 전환할 수 있습니다.

이것은, API 클라이언트가 키에 문자열만 보낼 수 있더라도, 이러한 문자열들이 순수한 정수형을 포함하는 한, Pydantic은 이것들을 전환하고 유효성 검사를 진행합니다.

그리고 weights 로 수신한 dict 은 실제로 int 키와 float 값을 갖게 됩니다.

 

요약

FastAPI를 사용하면 Pydantic Model에서 제공되는 엄청난 유연성을 사용할 수 있는 동시에, 당신의 코드를 단순하고, 간략하고 우아하게 만들 수 있습니다.

 

또한 아래와 같은 이점도 누릴 수 있습니다:

 

  • 편집기 지원 (어디서나 가능한 완성 기능!)
  • 데이터 전환 (파싱 / 직렬화로 알려진)
  • 데이터 유효성 검사
  • 스키마 문서화
  • 자동 문서화

 


원문

https://fastapi.tiangolo.com/tutorial/body-nested-models/

 

Body - Nested Models - FastAPI

Body - Nested Models With FastAPI, you can define, validate, document, and use arbitrarily deeply nested models (thanks to Pydantic). List fields You can define an attribute to be a subtype. For example, a Python list: from typing import Optional from fast

fastapi.tiangolo.com

 

728x90
반응형