한양과학기술고등학교

에듀테크 프로젝트 대시보드

파라미터 검증과 커스텀 검증기

Query Path field_validator model_validator 422

선언적 제약(ge, max_length…)으로 대부분 커버하고, 복잡한 규칙은 검증기 함수로 처리합니다.

1. 숫자·문자열 제약

제약의미
gt / ge / lt / le초과 / 이상 / 미만 / 이하
min_length / max_length문자열·리스트 길이
pattern정규식 (v1 의 regex)
multiple_of배수

2. field_validator (단일 필드)

from pydantic import BaseModel, field_validator

class SignUp(BaseModel):
    username: str
    password: str

    @field_validator("username")
    @classmethod
    def no_space(cls, v: str) -> str:
        if " " in v:
            raise ValueError("공백을 포함할 수 없습니다")
        return v.lower()   # 반환값이 최종 값이 됨

3. model_validator (필드 간 관계)

from pydantic import BaseModel, model_validator

class Period(BaseModel):
    start: int
    end: int

    @model_validator(mode="after")
    def check_order(self):
        if self.start > self.end:
            raise ValueError("start 는 end 보다 클 수 없습니다")
        return self

4. 검증 실패 응답 형식 (422)

{
  "detail": [
    {
      "type": "string_too_short",
      "loc": ["body", "password"],
      "msg": "String should have at least 8 characters",
      "input": "abc"
    }
  ]
}

loc 는 에러 위치 경로(body/query/path + 필드명).

5. 커스텀 타입 재사용

from typing import Annotated
from pydantic import Field

Username = Annotated[str, Field(min_length=3, max_length=20, pattern=r"^[a-z0-9_]+$")]

class A(BaseModel): username: Username
class B(BaseModel): owner: Username
"타입 힌트 하나로 검증·직렬화·문서화가 동시에 이뤄진다"