2016/11/12
将 SQLAlchemy 对象, 转化为Python-dict, 或者序列化成 JSON, 主要实现:
to_dict()
to_json()
我自己实现了一种做法, 但是总感觉还有些问题( 但是又说不清楚 ), 大家有什么比较好的办法?
将这两个方法直接绑定到Base上面, 则继承Base的类, 都能使用
def _gen_tuple(self):
def convert_datetime(value):
if value:
return value.strftime("%Y-%m-%d %H:%M:%S")
else:
return ""
for col in self.__table__.columns:
if isinstance(col.type, DateTime):
value = convert_datetime(getattr(self, col.name))
elif isinstance(col.type, Numeric):
value = float(getattr(self, col.name))
else:
value = getattr(self, col.name)
yield (col.name, value)
def to_dict(self):
return dict(self._gen_tuple())
def to_json(self):
return json.dumps(self.to_dict())
Base._gen_tuple = _gen_tuple
Base.to_dict = to_dict
Base.to_json = to_json
초대해주셔서 감사합니다
연재하려는 내용을 이해할 수 있습니다. 다음과 같은 효과를 얻고자 하는 것 같습니다.
으아악이전부터 이런 방식을 추구해왔지만 객체의 필드를
json
로 직접 변환한다는 것은 프런트엔드에서 필요하지 않은 많은 필드도 함께 반환된다는 의미입니다. 개인적으로 나는 프런트 엔드에 필요한 모든 것을 제공하는 경향이 있습니다. 따라서 이러한 간단한to_json
작업은 프런트 엔드에 반환해야 하는 내용을 잘 제어할 수 있는 일부 직렬화 플러그인을 결합하지 않는 한 그다지 좋지 않습니다. 그러나 이러한 플러그인을 살펴보면 그다지 좋지 않습니다. 사용하기 편리합니다. 오히려 직접 조립하는 게 더 유연해서 점차 그런 방식을 추구하지 않게 됐어요. 이것을 선호한다면django-rest-framework
플러그인을 확인해 보세요. 내부의 직렬화가 원하는 것일 수도 있습니다. SQLAlchemy ORM 외에도 Orator ORM이 있는데, 개인적으로 소스코드만 봐도 참 편하다는 생각이 듭니다.요컨대, 좋은 권장 사항은 없습니다. 물론 직접 구현할 수도 있습니다.
피클을 사용하지 않는 이유는 무엇인가요? 아니면 JSON으로 직렬화해야 하기 때문인가요?
mongodb + mongokit이 더 마음에 드실 겁니다