본문 바로가기
Python

Djongo ObjectID $oid 형식 수정하기

by Zih0 2021. 8. 14.

저는 현재 Djongo를 이용해서 Django + MongoDB 환경에서 프로젝트를 진행중입니다.

Model.objects.get 또는 filter를 사용해서 데이터를 불러올 경우, Response 안에 ObjectID가 아래와 같이 반환되는 경우가 있습니다.

{
  "_id": {
    "$oid": "abc123"
  }
}

$oid 부분이 마음에 들지 않았고 아래와 같이 반환되었으면 했습니다.

{
  "_id":  "abc123"
}

구글링을 하다가 답을 찾을 수 있었습니다.

https://stackoverflow.com/questions/16586180/typeerror-objectid-is-not-json-serializable#16586277

이를 위해 JSONEncoder를 수정해주었습니다.
타입이 ObjectId일 경우에 string으로 타입 변환 시켜주는 작업을 추가했습니다.

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

json.dumps를 사용할 때, cls에 커스텀한 JSONEncoder를 넣어주고 loads를 해주면 원하는 형태로 데이터를 리턴할 수 있었습니다.

json.loads(json.dumps(review_data, cls=JSONEncoder))

프로젝트에선 이 동작을 간편화하기 위해 따로 util 함수를 만들었습니다.

# server.utils.json_util.py
def jsonify(data):
    return json.loads(json.dumps(data, cls=JSONEncoder))

#views.py

from server.utils.json_util import jsonify

return Response({
            "success": True,
            "message": f"{review_len}개의 리뷰를 불러왔습니다.",
            "data": jsonify(review_data),
        })

댓글