FastAPI와 Pydantic을 사용해서 API를 만들던 중,,,
프론트엔드와의 협업을 위해 응답(JSON)은 camelCase로,
파이썬 내부에서는 snake_case로 리팩토링을 하던 중이었다.
Pydantic alias_generator
기능을 활용해 BaseModel을 상속한 CamelModel
을 만들어 사용.
from pydantic import BaseModel
def to_camel(string:str) -> str:
parts = string.split('_')
return parts[0] + ''.join(word.capitalize() for word in parts[1:])
class CamelModel(BaseModel):
class Config:
orm_mode = True
allow_population_by_field_name = True
alias_generator = to_camel
이렇게 하면 snake_case로 작성한 필드가 응답에서 자동으로 camelCase로 변환되어 나가야 하는데,,,
API를 호출했더니 아래와 같은 500 Internal Server Error 발생..
pydantic_core._pydantic_core.ValidationError: 7 validation errors for SumingData
sumingField
Field required [type=missing, input_value={'example_field': 'value', ...}, input_type=dict]
...
분명 suming_field
등 snake_case로 값을 넘겼는데, pydantic이 camelCase(sumingField
) 필드를 못찾겠다고 에러를 낸다.
리팩토링 전에는 동작하던 코드라 신입의 눈물...
고친 게 이것 뿐이라 분명 camelCase랑 snake_case 사이의 문제인 건 확실한데 뭐가 문제냐고 ㅠㅠ
alias_generator
는 출력 시에는 camelCase로 변환해주지만,allow_population_by_field_name
대신 populate_by_name
을 써야 하고,Config
대신 model_config
를 써야 한단다.버전 | 설정 방법 |
---|---|
v1 | class Config: ... allow_population_by_field_name = True |
v2 | model_config = { "populate_by_name": True } |
class CamelModel(BaseModel):
class Config:
orm_mode = True
allow_population_by_field_name = True
alias_generator = to_camel
class CamelModel(BaseModel):
model_config = {
"orm_mode": True,
"populate_by_name": True,
"alias_generator": to_camel,
}
populate_by_name=True
가 있어야 snake_case로도 값을 받을 수 있다.alias_generator
는 camelCase로 변환해서 응답에 사용한다.alias_generator
를 활용하면 된다.allow_population_by_field_name = True
populate_by_name = True