저는 현재 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),
})
댓글