PETCH-KR / Backend-Django

0 stars 0 forks source link

Djongo JSON Serializable Error #24

Open Zih0 opened 3 years ago

Zih0 commented 3 years ago

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

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

아래와 같은 형태로 바꿔주기 위해 utils에 JSONEncoder class를 만들었습니다.

{
  "_id":  "abc123"
}
class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

사용방법은 아래와 같이 작성하면 됩니다.

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

bson.json_util 의 dumps와 loads를 사용해왔는데, JSONEncoder를 커스텀해서 사용하기 위해선 json의 dumps를 사용해야했습니다.

위 문제를 다른 방법으로 해결했다면 알려주세요.

Zih0 commented 3 years ago

util 추가

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

response_object = {
            "success": True,
            "message": f"{user_review_len}개의 리뷰를 불러왔습니다.",
            "data": jsonify(user_review_data),
        }
Zih0 commented 3 years ago
class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)

        if isinstance(o, (datetime.datetime, datetime.date, datetime.time)):
            return o.isoformat()

        return json.JSONEncoder.default(self, o)

datetime format도 처리해줬습니다.