python - SQLAlchemy 对象进行 JSON 序列化, 有什么好的方法( 集思广益 )?

 书友59418658 发布于 2022-10-27 03:13

2016/11/12

问题

将 SQLAlchemy 对象, 转化为Python-dict, 或者序列化成 JSON, 主要实现:

  1. to_dict()

  2. 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
3 个回答
  • mongodb + mongokit应该比较对你胃口

    2022-10-27 03:13 回答
  • 为什么不用 pickle? 还是说因为必须序列化成 JSON?

    2022-10-27 03:13 回答
  • 谢邀

    能够理解你想要序列化的想法,我猜你想实现如下的效果:

    user = User.query.filter_by(id=id).first()
    
    response = jsonify(user.to_json())

    以前我也一直在追寻这样的方法,但是这样直接把一个对象里面的字段转成json意味着很多前端不需要的字段也会一起返回。个人并不是很喜欢,我倾向于前端需要什么就给什么。所以这样简单的to_json操作并不是很好,除非你结合一些序列化的插件,可以很好的控制哪些需要返回给前端的,不过看了一圈这样的插件,没有使用起来很方便的。反而是自己组装来的更灵活,所以渐渐的就不再去追寻这样的方法了。如果你比较喜欢这样的可以去看看django-rest-framework这个插件,里面的序列化或许是你想要的。除了SQLAlchemy这个ORM外,有个Orator的ORM,个人感觉还不错,光看源码就觉得很舒服,有机会你可以去看看。

    所以,总结来说并没有什么好的推荐,当然你可以自己去实现一个,大概就是这样了。

    2022-10-27 03:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有