[ FastAPI ] 바디 - 중첩된 모델
FastAPI를 사용하면 (Pydantic에 의해), 임의로 깊게 중첩된 모델을 정의, 유효성 검사, 문서화할 수 있습니다.
리스트 필드
어트리뷰트를 서브타입으로 정의할 수 있습니다. 예를 들어, 파이썬의 list 입니다:
이것은 tags 를 리스트의 아이템으로 만들어줍니다. 그럼에도 불구하고 개별 아이템에 대한 자료형을 선언하지는 않습니다.
자료형 매개변수를 사용한 리스트 필드
그러나 파이썬은 특정 방법을 통해 내부 자료형, 또는 "자료형 매개변수"와 함께 리스트를 선언할 수 있습니다.
타이핑의 List 임포트
우선, 표준 파이썬의 typing 모듈로부터 List 를 임포트하시기 바랍니다:
자료형 매개변수로 List 선언
list , dict , tuple 과 같은 자료형 매개변수(내부 자료형) 을 가진 자료형을 선언하기 위해서는:
- typing 모듈로부터 그것들을 임포트 하시기 바랍니다.
- 대괄호: [ 와 ] 를 사용하여 내부 자료형을 "자료형 매개변수"로써 전달하시기 바랍니다.
이것은 전부 자료형 선언에 대한 표준 파이썬 문법입니다.
동일한 표준 문법을 내부 자료형을 사용하여 모델 어트리뷰트에도 사용하시기 바랍니다.
결론적으로, 우리의 예시에서, tags 를 "문자열들의 리스트"로 특정지어 만들 수 있습니다:
타입 설정
그러나 태그는 유일무이한 문자열로 반복되지 않아야 한다는 걸 깨닫게 됩니다.
그리고 파이썬은 유일무이한 아이템들의 집합을 위한 특별한 데이터 자료형으로, set 을 갖고 있습니다.
따라서 Set 을 임포트하고 tags 를 str 의 set 으로써 선언할 수 있습니다:
이것을 사용하면, 만약 중복된 데이터 요청을 받더라도, 유일무이한 요소들의 집합으로 전환됩니다.
그리고 데이터를 내보낼 때, 만약 데이터가 중복되더라도, 유일무이한 집합으로 내보내집니다.
그리고 이에 따라 주석이 달리고 / 문서화 됩니다.
중첩 모델
각각의 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/
'FastAPI > Tutorial - User Guide' 카테고리의 다른 글
[ FastAPI ] 추가 데이터 자료형 (0) | 2021.09.19 |
---|---|
[ FastAPI ] 요청 예시 데이터 선언 (0) | 2021.09.19 |
[ FastAPI ] 바디 - 필드 (0) | 2021.09.15 |
[ FastAPI ] 바디 - 다중 매개변수 (0) | 2021.09.12 |
[ FastAPI ] 경로 매개변수와 숫자형 유효성 검사 (0) | 2021.09.03 |