본문 바로가기

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

 

pydantic 모델 파싱시 비어있는 필드에 대해

pydantic 모델 파싱시 주의 사항 request나 response로 넘어온 body data를 pydantic이 model로 파싱하는 과정에서 정의된 필드가 비어있는 경우 에러를 던진다. 에러가 발생하는 예시 from pydantic import BaseModel

the-boxer.tistory.com

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` 키워드를 쓰기 바란다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.