flask ORM 序列化和反序列化的两种方法
-
使用marshmallow 对数据进行序列化和反序列化
-
from marshmallow import Schema, fields, post_load from SQLconfig.models import * class User_ser(Schema): # 建立和数据库模型一样的类继承marshmallow中的Schema类 id = fields.Integer() # 使用marshmallow中的fields来约束数据类型 username = fields.Str() email = fields.Email() @post_load # 使用post_load来装饰json>object的函数 def make_user(self, data, **kwargs): return User(**data) schema = User_ser() # 实例化模型类 def user_serialize(args): resCode = 200 resMsg = '成功' data_message = schema.load(args) #对json数据进行反序列化 db.session.add(data_message) #进行入库 try: db.session.commit() except Exception as e: print(e) return {'rescode': resCode, 'resmsg': resMsg, 'data': []} def user_get(): resCode = 200 resMsg = '成功' data = User.query.all() #查询需要的数据 # data_message=[ i.serialize for i in data ] data_message = schema.dump(data, many=True) #对数据进行序列化,多条数据加many=True return {'rescode': resCode, 'resmsg': resMsg, 'data': data_message}
-
-
第二种方法,自定义数据转换
-
def to_json(inst, cls): # 自定义数据类型转换将object转换为json ret_dict = {} for i in cls.__table__.columns: # 获取到模型对象的所有列 value = getattr(inst, i.name) # 获取对象的属性值 if isinstance(value, datetime.datetime): # 对时间进行转换 value = value.strftime('%Y-%m-%d %H:%M:%S') ret_dict[i.name] = value # 添加到字典中 return ret_dict class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(50)) email = db.Column(db.String(80)) @property # 使用property获取对象的属性 def serialize(self): return to_json(self, self.__class__) # 直接返回实例对象本身和类本身 def user_get(): resCode = 200 resMsg = '成功' data = User.query.all() # 查询需要的数据 # data_message=[ i.serialize for i in data ] # 使用列表推导式来封装成json格式 data_message = schema.dump(data, many=True) # 对数据进行序列化,多条数据加many=True return {'rescode': resCode, 'resmsg': resMsg, 'data': data_message}
-