콘텐츠로 이동

답장

api _ 모델에서 pydantic 모델 대신 ormar 모델을 사용할 수 있습니다.

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

응답에서 가장 일반적인 작업 중 하나는 응답 데이터에 포함하지 않을 특정 필드를 제외하는 것입니다.

이는 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()

즉, 요청에서 첫 번째 _ 이름을 전달하지 않으면 필드가 선택 사항이기 때문에 올바르게 검증하고 데이터베이스에 저장한 다음 이 필드 없이 저장된 레코드를 반환합니다(이 필드도 유효합니다).

!!!필드 값을 통과하지 못했지만 필드 자체는 여전히 응답 _ 모델에 존재하므로 응답 데이터에 나타나고 없음으로 설정됩니다.

1
결과에서 필드를 완전히 제외하려면 읽으십시오.

FastApi 응답_모델_제외

FastAPI에는 필드 이름의 집합(또는 목록)을 수락하는 응답 _Model_가 있습니다.

Ormar 및 Pydantic은 제외/포함 열 또는 중첩 모델(아래에 더 있음)을 설정할 수 있는 사전도 수락하기 때문에 한계가 있습니다.

경고 확인 중에 실패하므로 응답 _ 모델을 사용할 때 필수 필드를 제외할 수 없습니다.

1
2
3
@app.post("//", _Model = 사용자, _model_ ={"password"})
비동기 def create_user(사용자: 사용자):
    귀환 대기user.save()

위의 엔드포인트는 다음과 같이 쿼리할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Starlette.testClient에서 TestClient 가져오기

클라이언트 = TestClient (앱)

클라이언트를 클라이언트로 사용:
        # 참고로 pk는 없습니다
        사용자={
            "이메일": "test@domain.com",
            "비밀번호": "^*^%A*DA*IAAA",
            "_name": "John",
            "last_name": "Doe",
        }
        응답=client.post("/사용자/", json=사용자)
        # 제외된 필드가 응답에서 완전히 사라졌습니다.
        응답이 아닌 "암호"를 주장합니다.json ()
        # 응답을 읽고 모델을 초기화합니다.
        d_user = 사용자 (** se.json ())
        # 참고 pk는 자동 증가로 채워집니다.
        created_user.pk 없음이 아니라고 주장
        # 초기화된 모델에서도 암호가 누락되었습니다.
        생성됨_사용자 암호가 없음을 주장합니다.

위의 예에서 암호 필드가 응답 데이터에서 완전히 사라지는 방법을 확인하십시오.

1
이 방법은 필요하지 않은 필드에만 사용할 수 있습니다.

중첩 모델 제외

Fasapi는 필드 이름 집합만 전달할 수 있으므로 간단히 제외되지만 ormar는 응답 _ 모델 _ 제외를 사용할 때 더 똑똑합니다.

Ormar에서는 두 가지 유형의 표기법을 사용하여 중첩 모델을 제외할 수 있습니다.

첫 번째는 모델 트리 구조를 나타내는 중첩 필드가 있는 사전이고 두 번째는 필드 이름에 대한 이중 밑줄 경로입니다.

사용자 범주가 별도의 모델이라고 가정합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
base_ormar_config = ormar. OrmarConfig (
    메타데이터 = 메타데이터
    데이터베이스 = 데이터베이스
)

클래스 카테고리(ormar. 모델):
    ormar_config = base_ormar_config (테이블 이름 = "카테고리")

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 255)
    우선 순위: int = ormar. 정수(nullable = 참)


클래스 사용자(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)
    카테고리: 옵션 [카테고리] = ormar. 외래 키(카테고리, 관련 이름 = "카테고리")

응답의 범주에서 우선 순위를 제외하려면 여전히 빠른 API 매개 변수를 사용할 수 있습니다.

1
2
3
@app.post("//", _Model=사용자, _model_={"category__priority"})
비동기 def create_user(사용자: 사용자):
    귀환 대기user.save()

이중 밑줄을 사용하여 모델로 더 깊이 들어갈 수 있으며 중첩 모델에서 여러 필드를 제외하려면 전체 경로로 앞에 서야 합니다.response_model_exclude={"category__priority", "category__other_field", category__nested_model__nested_model_field} ETC 예에서.

!!!참고 가능한 제외 사항과 제외 사전 또는 설정을 작성하는 방법에 대해 자세히 알아보려면 설명서의 필드 섹션을 방문하십시오.

응답 \ _ 모델 \ _ 제외 매개 변수 외에도 Fastapi는 pydantic에서 상속된 다른 매개 변수도 지원합니다. 이 모든 것은 ormar와도 함께 작동하지만 약간의 뉘앙스가 있을 수 있으므로 문서의 dt 섹션을 읽는 것이 가장 좋습니다.

Model.Model_dump에서 제외 ()

또는 ormar에서 사전을 반환할 수 있습니다. 모델링하고 사용하십시오.

이렇게 사전으로 제외/포함을 설정하고 중첩 모델의 필드를 제외할 수도 있습니다.

!!!경고 응답_ 모델을 사용하지 않으면 이론적으로 응답에 형식이 있을 수 있으므로 API 문서에 응답 예제와 스키마가 없습니다.

1
2
3
4
5
@app.post("/users2/", _Model = 사용자)
비동기 def create_user2 (사용자: 사용자):
    사용자=대기user.save()
    사용자 모델_dump 반환(제외={'password'})
    #는 또한 반환 사용자와 같은 것일 수 있습니다. model_dump(제외={'카테고리':{'priority'}}) 범주 우선 순위를 제외합니다.

!!!요청에서 암호 필드를 통과하더라도 위의 예에서는 암호 필드가 무효화되지만 응답 스키마의 일부이고 값이 없음으로 설정되기 때문에 필드가 여전히 존재합니다.

이런 식으로 필드를 완전히 제외하려면 응답_모델을 사용하지 말고 모델_dump()에서 제외하십시오.

또는 ormar 모델에서 사전을 반환할 수도 있습니다. 이와 같이 사전에 제외/포함을 설정하고 중첩 모델의 필드를 제외할 수도 있습니다.

!!!이론적으로는 여기서 응답 유효성을 잃게 되지만 ormar에서 작동 중이기 때문입니다. 모델, 응답 데이터는 데이터베이스 쿼리 후에 이미 검증됩니다(ormar 모델은 피단트 모델이기 때문입니다).

따라서 응답_모델을 완전히 건너뛰면 다음을 수행할 수 있습니다.

1
2
3
4
@app.post("/users4/")
비동기 def create_user4 (사용자: 사용자):
    사용자=대기user.save()
    사용자 model_dump 반환(제외={'last_name'})

!!!응답_ 모델을 건너뛸 때 반환 후 응답이 더 이상 검증되지 않으므로 이제 필수 필드를 제외할 수도 있습니다.

1
이 솔루션의 비용은 빠른 api 관점에서 알 수 없는 응답 스키마로 api 문서도 느슨하게 만드는 것입니다.

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

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

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

1
2
3
4
5
# 사용자의 암호 없이 중첩된 범주에서 우선 순위 없이 모델 트리 생성
응답 사용자 = 사용자. get_pydantic(제외 = {"암호": ..., "카테고리":{"priority"}})
@app.post("/users3/", _Model = seuser) # 여기에서 생성된 모델을 사용하십시오.
비동기 def create_user3 (사용자: 사용자):
    귀환 대기user.save()

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

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

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

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

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

독립 캔틸레버 모델

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

샘플:

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

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

    이메일: str
    이름: str
    성: str


@app.post("/users3/", _Model = UserBase) # 여기에서 pydantic 모델을 사용하십시오.
Async def create_user3 (사용자: 사용자): # 여기에서 ormar 모델을 사용하십시오(물론 여기에서도 pydantic을 사용할 수 있습니다)
    귀환 대기user.save()