Peewee의 모델을 PostgreSQL에 저장하려고 할 때이 문제가 발생했습니다 JSONField
.
잠시 동안 고생 한 후 일반적인 해결책이 있습니다.
내 솔루션의 핵심은 Python의 소스 코드를 살펴보고 코드 문서 ( here )가 기존 json.dumps
데이터 를 확장하여 다른 데이터 유형을 지원 하는 방법을 이미 설명하고 있음을 알고 있습니다.
현재 JSON으로 직렬화 할 수없는 일부 필드가 포함 된 모델이 있고 JSON 필드가 포함 된 모델이 원래 다음과 같다고 가정합니다.
class SomeClass(Model):
json_field = JSONField()
다음 JSONEncoder
과 같이 사용자 정의를 정의 하십시오.
class CustomJsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, SomeTypeUnsupportedByJsonDumps):
return < whatever value you want >
return json.JSONEncoder.default(self, obj)
@staticmethod
def json_dumper(obj):
return json.dumps(obj, cls=CustomJsonEncoder)
그런 다음 JSONField
아래처럼 사용하십시오 .
class SomeClass(Model):
json_field = JSONField(dumps=CustomJsonEncoder.json_dumper)
열쇠는 default(self, obj)
위 의 방법입니다. ... is not JSON serializable
Python에서 수신하는 모든 단일 불만에 대해 직렬화 할 수없는 JSON 유형 (예 : Enum
또는 datetime
) 을 처리하는 코드를 추가하십시오.
예를 들어, 다음에서 상속되는 클래스를 지원하는 방법은 Enum
다음 과 같습니다.
class TransactionType(Enum):
CURRENT = 1
STACKED = 2
def default(self, obj):
if isinstance(obj, TransactionType):
return obj.value
return json.JSONEncoder.default(self, obj)
마지막으로 위와 같이 구현 된 코드를 사용하면 Peewee 모델을 아래와 같이 JSON으로 변환 가능한 객체로 변환 할 수 있습니다.
peewee_model = WhateverPeeweeModel()
new_model = SomeClass()
new_model.json_field = model_to_dict(peewee_model)
위의 코드는 Peewee에만 해당되지만, 나는 생각합니다.
- 일반적으로 다른 ORM (Django 등)에 적용 가능
- 또한
json.dumps
작동 방식 을 이해하면 이 솔루션은 일반적으로 Python (sans ORM)에서도 작동합니다.
질문은 의견 섹션에 게시하십시오. 감사!