Django ninja 로 API Schema를 만드는데 None type으로 정희한 부분에서 에러가 발생했다.
Null이 들은 필드의 값을 받아오는 Schema에서 기본값으로 None을 주면 Exception이 발생하지 않은 것 같은데
갑자기 발생하네
response.items.1.manager2_position
Input should be a valid string [type=string_type, input_value=None, input_type=NoneType]
For further information visit https://errors.pydantic.dev/2.6/v/string_type
에러 내용은 대충 이러했다.
class ProductInSchema(ModelSchema):
note: str = None
spec: str = None
버전 업을 하기 전에는 오류 없이 넘어 갔었던거 같은데 암튼 역시 해결책을 가진 사람을 찾을 수 있었다.
https://the-boxer.tistory.com/m/66
None에 대해 간과한 점
python에서 None은 값일 뿐 아니라 독립적인 type으로도 구분이 된다.
dictionary에서 빈값은 None type으로 처리된다. 즉, 위 경우에서 id 필드가 포함되지 않은 값은 pydantic이 파싱하는 과정에서 None 타입으로 인식하고 int 형이 아니기 때문에 에러를 던졌다고 이해할 수 있다.
결국 위에서 정의한 모델은 Optional 조건을 추가하거나 None 타입을 허용하게 하여 다음과 같이 수정해야 한다.
class Foo(BaseModel):
# Optional 사용
id: Optional[int]
# Union으로 타입 지정
id: Union[int, None]
name: str
이런식으로 수정해서 해결!!
class ProductInSchema(ModelSchema):
note: Optional[str] = None
spec: Optional[str] = None
class Config:
model = Product
model_fields = ['id', 'username', 'first_name', 'last_name']
NULL, null 값이 있는 필드를 Schema로 받아오거나 넘길때 꼭 주의 해서 `Optional` 키워드를 쓰기 바란다.
'IT > 파이썬' 카테고리의 다른 글
@classmethod 사용 예 (0) | 2024.05.17 |
---|---|
파이썬에서 파일 열기: `w`와 `wt` 모드의 차이점 및 한글 인코딩 처리 (0) | 2024.05.16 |
북마크 - 매력적인 프론트 엔드를 만드는 파이썬 웹 프레임워크 3가지 (0) | 2023.07.20 |
AWS 라이트세일 - 파이썬 코드 백그라운드 돌려놓기 (0) | 2023.07.07 |
파이썬 - 변수 넘길때 복사인지 포인트만 넘어가는지? (0) | 2023.07.07 |