본문 바로가기

Backend/FastAPI

MongoEngine Document to Pydantic (ObjectId 처리하기)

MongoEngine의 Document를 dict, 또는 Pydantic으로 변환시, ObjectId 파싱이 제대로 되지 않는 문제가 있었다.

다음 문서를 보고 MongoEngine의 Document를 Pydantic으로 변환하기 위해 GetterDict 클래스를 구현해줬다.

https://docs.pydantic.dev/usage/models/#data-binding

from typing import Any

from bson import ObjectId
from pydantic import BaseModel
from pydantic.utils import GetterDict

class ModelGetter(GetterDict):

    def get(self, key: Any, default: Any = None) -> Any:
        value = self._obj.__getitem__(key)
        if isinstance(value, ObjectId):
            return str(value)
        else:
            return self._obj.__getitem__(key)

class ConfigBase(BaseModel):
    class Config:
        orm_mode = True
        getter_dict = ModelGetter

GetterDict의 get은, 모든 필드를 순회하며 convert해준다. 이 때, ObjectId를 만나면 String으로 변환해주도록 만든 코드이다.

BaseModel의 orm_mode=True 는 from_orm() 메소드 사용을 가능하게 해준다.

'Backend > FastAPI' 카테고리의 다른 글

FastAPI에서 예외처리하기  (0) 2022.10.17