Как сериализатор список объектов в 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"]}
Вам также придется обрабатывать любые специальные типы. Вы даже можете придумать и попытаться отразить, какие столбцы на модели автоматически.
Кстати, пароли хранятся в виде открытого текста, который я вижу?