网站建设 教学设计,官方网站建设报价表,展示型网站建设的建议,宁波公司网页制作在前后端分离项目中#xff0c;经常需要把ORM模型转化为字典#xff0c;再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前#xff0c;我都是通过类似Java中的反射原理#xff0c;获取当前ORM模型的所有字段#xff0c;然后写一个to_dict方法来将字段以及… 在前后端分离项目中经常需要把ORM模型转化为字典再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前我都是通过类似Java中的反射原理获取当前ORM模型的所有字段然后写一个to_dict方法来将字段以及他的值封装成字典。大概的代码如下所示 def to_dict(self):return {c.name: str(getattr(self, c.name)) for c in self.__table__.columns}这种做法虽然一定程度上方便了开发但也是带着枷锁跳舞存在以下几个弊端 无法优雅的排除不需要序列化的字段。 无法优雅的序列化多表之间的关系。
直到后来我遇到了sqlalchemy_serializer泪流满面这不就是我苦苦寻找的ORM模型序列化库吗使用他序列化ORM模型让我带你看看有多爽!
一、安装
sqlalchemy-serializer已经上架PyPi因此通过pip命令即可安装 pip install SQLAlchemy-serializer二、基本使用
如果想要让某个ORM模型能被序列化那么只需要在定义模型的时候让他继承自sqlalchemy_serializer.SerializerMixin即可示例代码如下
from sqlalchemy_serializer import SerializerMixinclass UserModel(db.Model, SerizlizerMixin):__tablename__ userid db.Column(db.String(100), primary_keyTrue, defaultshortuuid.uuid)email db.Column(db.String(50), uniqueTrue, nullableFalse)username db.Column(db.String(50), nullableFalse)password db.Column(db.String(200), nullableFalse)SerizlizerMixin会给ORM模型添加一个to_dict方法此时你可以通过一行代码将ORM模型序列化成字典
user UserModel.query.filter(...).one()
user_dict user.to_dict()上述代码中将把UsrModel中所有字段都序列化成字典。
三、排除字段
模型中有的字段不需要被序列化比如用户的密码那么这时候可以通过设置rules参数或者only参数来指定序列化规则。比如排除password那么可以通过如下代码方式实现
user UserModel.query.filter(...).one()
user_dict user.to_dict(rules(-password,))上述代码中在调用to_dict方法的时候传递了rules参数并且设置了-password其中的-号代表排除的意思意思是不要序列化password。如果在绝大部分场景下都不需要某些字段可以把这个规则写在模型定义中这样所有序列化的时候都会遵循这个序列化规则。比如
class UserModel(db.Model, SerizlizerMixin):serialize_rules (-password, )__tablename__ userid db.Column(db.String(100), primary_keyTrue, defaultshortuuid.uuid)email db.Column(db.String(50), uniqueTrue, nullableFalse)username db.Column(db.String(50), nullableFalse)password db.Column(db.String(200), nullableFalse)如果需要排除的字段太多了我们可以通过设置serialize_only属性来标记仅仅序列化某些字段。比如
class UserModel(db.Model, SerizlizerMixin):serialize_only (id, username)__tablename__ userid db.Column(db.String(100), primary_keyTrue, defaultshortuuid.uuid)email db.Column(db.String(50), uniqueTrue, nullableFalse)username db.Column(db.String(50), nullableFalse)password db.Column(db.String(200), nullableFalse)上述代码在序列化的时候就只会序列化id和username两个字段了。
四、递归序列化模型和树
sqlalchemy_serializer会默认序列化定义好关系的模型比如有UserModel和PostModel两个模型
class UserModel(db.Model, SerizlizerMixin):serialize_rules (-posts,)__tablename__ userid db.Column(db.String(100), primary_keyTrue, defaultshortuuid.uuid)username db.Column(db.String(50), nullableFalse)class PostModel(db.Model, SerializerMixin):__tablename__ postid db.Column(db.String(100), primary_keyTrue, defaultshortuuid.uuid)title db.Column(db.String(100), nullableFalse)content db.Column(db.Text, nullableFalse)author_id db.Column(db.String(100), db.ForeignKey(user.id))author db.relationship(UserModel, backrefposts)在序列化PostModel的时候也会自动递归序列化author并且author的值有id和username两个字段。这里有个细节需要注意就是UserModel必须要排除posts。因为PostModel中的author字段通过backref给UserModel绑定了一个posts字段如果不排除posts那么在序列化author的时候又会序列化posts造成循环递归序列化。
五、高级用法
基本上学会以上用法后99%的场景都没有问题了。如果你在使用sqlalchemy_serializer还有其他业务需求比如格式化日期的输出、字段扁平化等那么可以再仔细阅读一下sqlalchemy_serializer的官方文档官方文档
项目中引用 将登录后数据序列化返回 序列化后的数据此时看到的跟该用户相关的评论,帖子也序列化了这就会循环序列化 可以设置仅序列化的字段