Как сериализатор список объектов в sqlalchemy?

Я использую jsonpickle для сериализатора, когда я выбираю все в базу данных, я собираюсь преобразовать объект списка в json, когда я использую jsonpickle для этого, я получаю следующие выходные данные:

коды:

 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 ответа

Попробуйте определить __getstate__ а также __setstate__ на вашем объекте SQLAlchemy следующим образом

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

Это не то что jsonpickle для. pickle а также jsonpickle используются для сериализации произвольного объекта Python в некоторый формат, чтобы впоследствии его можно было десериализовать в точно такой же объект Python. Они не используются для сериализации объектов в соответствии с определенной схемой.

Для вашего случая вы должны написать логику сериализации самостоятельно. Пример:

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

Вам также придется обрабатывать любые специальные типы. Вы даже можете придумать и попытаться отразить, какие столбцы на модели автоматически.

Кстати, пароли хранятся в виде открытого текста, который я вижу?

Другие вопросы по тегам