콘텐츠로 이동

요청

FastAPI 요청 본문 매개 변수에서 Pydantic 모델 대신 Ormar 모델을 사용할 수 있습니다.

또한 ormar를 혼합 할 수 있습니다. 필요한 경우 pydantic이있는 모델.

요청에서 가장 일반적인 작업 중 하나는 API로 전송되는 페이로드에 포함하지 않을 특정 필드를 제외하는 것입니다.

이는 Ormar에서 다양한 방법으로 달성할 수 있으므로 아래에서 옵션을 검토하고 상황에 가장 적합한 옵션을 선택할 수 있습니다.

요청에서 필드 제외

선택 필드

각 선택 필드는 필요하지 않으므로 응답과 요청 모두에서 선택 필드를 건너뛸 수 있습니다.

다음 중 하나가 발생하는 경우 필드는 필요하지 않습니다.

  • nullable로 표시된 필드 = 참
  • 필드에는 기본값 또는 제공된 기능(예: 기본값 = "테스트")이 있습니다.
  • 필드는 서버 _기본값을 설정합니다.
  • 필드는 autoincrement=Trueprimary_key 필드(참고 ormar)입니다. 정수 기본 _key 기본값은 자동 증가입니다)

예:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
base_ormar_config = ormar. OrmarConfig (
    메타데이터 = 메타데이터
    데이터베이스 = 데이터베이스
)

클래스 사용자(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이메일: str=ormar. 문자열(max_long=255)
    암호: str = ormar. 문자열(max_long = 255)
    첫 번째 이름: str = ormar. 문자열(max_long = 255, nullable = True)
    성: str = ormar. 문자열(max_long = 255)
    범주: str = ormar. 문자열(max_long = 255, 기본값 = "사용자")

위의 예에서 필드 ID(자동 증가 정수), 첫 번째 _ 이름(nullable = True) 및 범주(기본값이 있는)는 선택 사항이며 응답에서 건너뛸 수 있으며 모델은 여전히 유효합니다.

필드가 nullable인 경우 생성 중 및 응답 중에 페이로드에 포함될 필요가 없으므로 위의 예에 따라 다음을 수행할 수 있습니다.

!!! 경고 옵션 필드를 통과할 필요는 없지만 여전히 통과할 수 있습니다. 누군가가 값을 전달하면 나중에 사용할 수 있습니다. 이를 방지하기 위한 조치를 취하지 않는 한 말입니다.

1
2
3
4
# 앱은 FastApi 앱입니다.
@app.post("/사용자/", _Model = 사용자) # 여기에서는 ormar를 사용합니다. 응답 모델
Async def create_user (사용자: 사용자): # 여기에서 ormar를 사용합니다. 요청 매개 변수의 모델
    귀환 대기user.save()

즉, 요청에서 먼저 _ 이름을 전달하지 않으면 필드가 선택 사항이므로 올바르게 검증되고 없음이 데이터베이스에 저장됩니다.

ormar에서 pydantic 모델을 생성합니다. 모델

필드를 제외하는 작업이 매우 일반적이기 때문에 Ormar는 기존 Ormar에서 Pydantic 모델을 생성하는 특별한 방법을 가지고 있습니다. 모든 필드를 다시 입력할 필요가 없는 모델.

이 메서드는 모든 모델 클래스에서 사용할 수 있는 get_pydantic() 메서드입니다.

1
2
3
4
5
6
# 사용자의 암호 없이 중첩된 범주에서 우선 순위 없이 모델 트리 생성
요청 사용자 = 사용자. get_pydantic (제외 = {"암호": ..., "카테고리": {"priority"}})
@app.post("/users3/", _Model = 사용자) # 여기에서 ormar/pydantic을 모두 사용할 수도 있습니다.
Async def create_user3 (사용자: 요청 사용자): # 여기에서 생성된 모델을 사용하십시오.
    # 이제 사용자는 ormar Model이 아닌 pydantic이므로 변환해야 합니다.
    반환 대기 사용자 (** user. model_dump ()).저장 ()

!!! 참고 더 많은 예제를 보고 더 많이 읽으려면 설명서의 get_pydantic 섹션을 방문하십시오.

경고 get_pydantic 메서드는 모델의 루프를 피할 수 있는 알고리즘을 기반으로 중첩 모델 트리의 모든 모델을 생성합니다(모델_dump(), _all() 선택 등).

1
2
3
즉, 중첩 모델에는 상위 모델에 대한 참조가 없습니다(기본적으로 ormar 관계는 양방향입니다).

또한 주어진 모델이 트리에 두 번 이상 존재할 경우 피단틱 모델에서 두 배로 증가합니다(각 발생에는 별도의 모델이 있음).

이렇게 하면 트리의 여러 잎에 다른 필드를 제외/포함할 수 있습니다.

MyPy 및 유형 확인

함수를 파이썬 유형으로 할당하면 런타임에 통과하고(확인되지 않았기 때문에) MyPy와 같은 정적 유형 검사기가 불만을 제기합니다.

함수 호출의 결과는 주어진 모델에 대해 항상 동일하지만 동적으로 생성된 유형은 허용되지 않습니다.

두 가지 옵션이 있습니다.

첫 번째는 단순히 # type을 추가하는 것입니다. 유형 확인을 건너뛰려면 무시하십시오.

1
2
3
4
5
요청 사용자 = 사용자. get_pydantic (제외 = {"암호": ..., "카테고리":{"priority"}})
@app.post("/users3/", _Model = 사용자)
비동기 def create_user3 (사용자: 요청 사용자): # 유형: 무시
    # 이제 사용자가 ormar Model이 아니므로 변환해야 합니다.
    반환 대기 사용자 (** user. model_dump ()).저장 ()

두 번째는 FastAPI를 사용하여 함수 매개 변수를 추출하는 좀 더 진부합니다.

지정된 매개 변수에 대해 __주석__ 항목을 재정의할 수 있습니다.

1
2
3
4
5
6
7
8
요청 사용자 = 사용자. get_pydantic (제외 = {"암호": ..., "카테고리":{"priority"}})
# 앱 데코레이터 사용하지 마세요
Async def create_user3 (사용자: 사용자): # 여기에서 ormar 모델을 사용하십시오.
    반환 대기 사용자 (** user. model_dump ()).저장 ()
# 생성된 모델로 사용자 매개 변수에 대한 함수 주석 항목을 덮어씁니다.
create_user3__tions__["사용자"] = 사용자 요청
# 앱 기능(app.get, app.post 등)을 수동으로 호출하고 기능 참조를 전달합니다.
app.post("//", _Model = 사용자) (create_user3)

이렇게 하면 mypy가 사용자가 ormar 모델이라고 "생각"하게 되지만 요청에서는 중요하지 않으므로(어쨌든 jsonized 판결을 통과하고 저장하기 전에 변환해야 함).

결과 모델이 필드의 하위 집합이 되므로 모든 필수 필드가 검증되고 사용되지 않은 모든 필드가 런타임에 실패하기 때문에 이 작업은 여전히 잘 작동합니다.

독립 캔틸레버 모델

마지막 해결책은 수동으로 별도의 Pydantic 모델을 만드는 것입니다. 일반 FastAPI 응용 프로그램과 동일하게 작동하므로 다양한 응답 및 요청 모델 등을 사용할 수 있습니다.

샘플:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
피단틱 가져오기

클래스 사용자 생성(피단틱. 기본 모델):
    model_config = pydantic. 구성 Dict (from_ = 참)

    이메일: str
    이름: str
    성: str
    비밀번호: str


@app.post("/users3/", _Model = 사용자) #여기서 ormar 모델을 사용하십시오(물론 여기에서도 pydantic을 사용할 수 있습니다)
Async def create_user3 (사용자: 사용자 생성): # 여기에서 pydantic 모델을 사용하십시오.
    # 이제 요청 param이 ormar 모델이 아니라 pydantic 모델인지 주목하십시오.
    # 따라서 데이터베이스를 사용하기 전에 구문 분석/ormar로 변환해야 합니다.
    반환 대기 사용자 (** user. model_dump ()).저장 ()