[toc]
SqlAlchemy-serializer序列化库笔记
sqlalchemy-serializer 是一个专为 SQLAlchemy ORM 设计的序列化工具库,它提供了简单而强大的方式将 SQLAlchemy 模型对象转换为可序列化的字典数据或 JSON 数据。
安装 sqlalchemy-serializer 库
bash
pip install sqlalchemy-serializer使用方式
如果想要某个sqlalchemy模型类能够被序列化,那么需要在定义sqlalchemy模型类的适合,让该模型类继承sqlalchemy_serializer.SerializerMixin类即可。
SerializerMixin类会给sqlalchemy模型类提供一个to_dict方法,该方法可以将sqlalchemy模型类对象转换为一个字典数据。
示例如下
python
from sqlalchemy import Column, Integer, String ,DateTime,CHAR,func
# 导入sqlalchemy_serializer库的SerializerMixin类
from sqlalchemy_serializer import SerializerMixin
# 定义sqlalchemy模型类,并继承SerializerMixin类
class UserModel(db.Model, SerializerMixin):
__tablename__ = "t_user"
id = Column("id",Integer, primary_key=True, autoincrement=True, comment='id')
name = Column("name",String(255),unique=True,nullable=False, comment='名称')
password = Column("password",String(255),unique=True,nullable=False, comment='密码')
# 查询用户,返回单个sqlalchemy模型类对象
user = db_session.query(UserModel).filter(UserModel.id == 111).first()
# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据
user_dict = user.to_dict()
# 打印序列化后的字典数据
print(user_dict)
# 查询用户列表,返回sqlalchemy模型类对象数组
user_list_items = db_session.query(UserModel).all()
# 调用to_dict方法将sqlalchemy模型类对象数组转换为字典数据数组
user_dict_list = [item.to_dict() for item in user_list_items]
# 打印序列化后的用户列表
print(user_dict_list)排除某个序列化字段
如果sqlalchemy模型类中的有的字段不需要被序列化,比如密码字段,那么可以通过设置rules参数,或者only参数来指定序列化规则。
代码示例如下
python
# 查询用户,返回单个sqlalchemy模型类对象
user = UserModel.query.filter(...).one()
# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据,排除password字段
user_dict = user.to_dict(rules=('-password',))
# 调用to_dict方法将sqlalchemy模型类对象转换为字典数据,排除password和name字段
user_dict = user.to_dict(rules=('-password','-name'))- 调用to_dict方法的时候,传递了rules参数,并且设置了
-password,其中的-号代表排除的意思,意思是不要序列化password字段。
排除多个序列化字段
我们还可以在SqlAlchemy模型类中定义一个__serializer_rules__属性,该属性的值是一个元组,元组中包含了需要被排除的字段名。
代码示例如下
python
# 定义sqlalchemy模型类,并继承SerializerMixin类
class UserModel(db.Model, SerializerMixin):
__tablename__ = "t_user"
id = Column("id",Integer, primary_key=True, autoincrement=True, comment='id')
name = Column("name",String(255),unique=True,nullable=False, comment='名称')
password = Column("password",String(255),unique=True,nullable=False, comment='密码')
# 定义需要被排除的字段名
__serializer_rules__ = ('-password','-name')
# 查询数据
user = db_session.query(UserModel).filter(UserModel.id == 111).first()
# 此时调用to_dict方法进行序列化数据,会自动排除__serializer_rules__属性中定义的字段
user_dict = user.to_dict()
print(user_dict)