如何在sqlalchemy中序列化列表对象?

时间:2016-03-01 05:41:22

标签: python django python-3.x sqlalchemy jsonpickle

当我选择数据库时,我使用jsonpickle作为序列化程序,我将使用jsonpickle将列表对象转换为json,我得到此输出:

代码:

 Session = sessionmaker(bind=connect.ConnectorMySql())
                    ses = Session()
                    lst =  ses.query(pModel).all()
                    return lst

jsonpickle:

serialized_obj = jsonpickle.encode(lst[0])

输出:

{"py/object": "Models.UserModel.", "sa_instance_state": {"py/object": "sqlalchemy.orm.state.InstanceState", "py/state": {"instance": {"py/id": 0}, "committed_state": {}, "class": {"py/type": "Models.UserModel."}, "manager": {"py/object": "sqlalchemy.orm.instrumentation.SerializeManager", "class": {"py/type": "Models.UserModel.Student"}}, "key": {"py/tuple": [{"py/type": "Models.UserModel.Student"}, {"py/tuple": [1]}]}, "expired_attributes": {"py/set": []}}}, "name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}

但我需要这种格式json:

{"name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}

你对这项工作有更好的想法吗?

2 个答案:

答案 0 :(得分:0)

这不是jsonpickle的用途。 picklejsonpickle用于将任意Python对象序列化为某种格式,以便以后可以将其反序列化为完全相同的Python对象。它们不用于根据特定模式对对象进行序列化。

对于您的情况,您必须自己编写序列化逻辑。例如:

obj = lst[0]
serialized_obj = {k: getattr(obj, k) for k in ["name", "fullname", "password", "id"]}

您还必须处理任何特殊类型。您甚至可以想象并尝试自动反映模型中的列。

顺便问一下,我看到以明文形式存储的密码吗?

答案 1 :(得分:0)

尝试如下在SQLAlchemy对象上定义__getstate____setstate__

def __getstate__(self):
    state = {}
    for k, v in self.__dict__.items():
        if k != '_sa_instance_state':
            state[k] = v
    return state

def __setstate__(self, d):
    self.__dict__ = d

jsonpickle将使用它们来腌制/去渍,如果我理解正确的话,您将不会存储_sa_instance_state,这是内部记账的内容。

此处有一些相关信息:http://docs.sqlalchemy.org/en/latest/orm/extensions/mutable.html#supporting-pickling