SQLAlchemy模型序列化器。
项目描述
SQLAlchemy模型序列化。
动机
Serialchemy 是作为 Flask-RESTAlchemy 的一个模块开发的,Flask-RESTAlchemy 是一个使用 Flask 和 SQLAlchemy 创建 Restful API 的库。我们最初尝试了 marshmallow-sqlalchemy,这可能是 SQLAlchemy 模型序列化最知名的库,但我们遇到了 与嵌套模型相关的问题。我们还认为,从底层开始考虑 SQLAlchemy,而不是在 marshmallow-sqlalchemy(它需要在 marshmallow 之上设计和构建)的基础上设计和构建,可以构建一个更简单、更易于维护的解决方案。
如何使用它
序列化通用类型
假设我们有一个 Employee SQLAlchemy 模型声明
class Employee(Base):
__tablename__ = "Employee"
id = Column(Integer, primary_key=True)
fullname = Column(String)
admission = Column(DateTime, default=datetime(2000, 1, 1))
company_id = Column(ForeignKey("Company.id"))
company = relationship(Company)
company_name = column_property(
select([Company.name]).where(Company.id == company_id)
)
password = Column(String)
通用类型 由 ModelSerializer 自动序列化
from serialchemy import ModelSerializer
emp = Employee(fullname="Roberto Silva", admission=datetime(2019, 4, 2))
serializer = ModelSerializer(Employee)
serializer.dump(emp)
# >>
{
"id": None,
"fullname": "Roberto Silva",
"admission": "2019-04-02T00:00:00",
"company_id": None,
"company_name": None,
"password": None,
}
可以使用相同的序列化器反序列化新项目
new_employee = {"fullname": "Jobson Gomes", "admission": "2018-02-03"}
serializer.load(new_employee)
# >> <Employee object at 0x000001C119DE3940>
序列化器不会提交到数据库。您必须自己这样做
emp = serializer.load(new_employee)
session.add(emp)
session.commit()
自定义序列化器
对于 通用类型 之外的所有内容,我们必须扩展 ModelSerializer 类
class EmployeeSerializer(ModelSerializer):
password = Field(load_only=True) # passwords should be only deserialized
company = NestedModelField(Company) # dump company as nested object
serializer = EmployeeSerializer(Employee)
serializer.dump(emp)
# >>
{
"id": 1,
"fullname": "Roberto Silva",
"admission": "2019-04-02T00:00:00",
"company": {"id": 3, "name": "Acme Co"},
}
扩展多态序列化器
一种可能性是将 SQLAlchemy 连接表继承及其子表一起序列化。为此,需要设置一个带有所需模型类名称的变量。以这个 Employee 类为例,假设它有一个连接表继承
class Employee(Base):
...
type = Column(String(50))
__mapper_args__ = {"polymorphic_identity": "employee", "polymorphic_on": type}
class Engineer(Employee):
__tablename__ = "Engineer"
id = Column(Integer, ForeignKey("employee.id"), primary_key=True)
association = relationship(Association)
__mapper_args__ = {
"polymorphic_identity": "engineer",
}
要在 Engineer 类上使用扩展的 ModelSerializer 类,应该创建序列化器如下
class EmployeeSerializer(
PolymorphicModelSerializer
): # Since this class will be polymorphic
password = Field(load_only=True)
company = NestedModelField(Company)
class EngineerSerializer(EmployeeSerializer):
__model_class__ = Engineer # This is the table Serialchemy will refer to
association = NestedModelField(Association)
贡献
有关设置开发环境以及如何向 serialchemy 贡献的指导,请参阅 贡献指南。
发布
关于如何创建新版本的提醒。
请注意,VERSION 应遵循语义版本控制,例如 X.Y.Z,例如:v1.0.5
从 upstream/master 创建一个 release-VERSION 分支。
更新 CHANGELOG.rst。
推送包含更改的分支。
一旦所有构建都通过,请将 VERSION 标签推送到 upstream。
合并 PR。
历史记录
1.0.1 (2023-17-11)
修复 setup.py 上的许可证位置
1.0.0 (2023-14-11)
添加对 SQLAlchemy 强制(经典)映射的支持
放弃对 Python 3.8 以下版本的支持
放弃对 SQLAlchemy 1.3 的支持
0.4.0 (2023-12-11)
修复:在多态序列化器中获取模型属性名称而不是表列名称
将多态模型序列化器扩展到接受在搜索多态列键时也接受列描述符。
添加对 Python 枚举序列化的支持
将多态模型序列化器更改为支持继承模型的继承模型
将字段更改为使用默认序列化器对非 None 值进行序列化
添加对 sqlalchemy 1.4 的支持
添加 EnumKeySerializer
0.3.0 (2019-17-07)
将复合字段添加到模型的属性列表中,以便在序列化该字段时如果其类型在 EXTRA_SERIALIZERS 中。
修复 SQLAlchemy 复合属性的错误
添加了 dump 和 load 自由函数,以便用户可以快速将 SQLAlchemy 模型导出,而无需实例化 ModelSerializer。
0.2.0 (2019-03-22)
修复:当反序列化嵌套模型时,如果 SQLAlchemy 模型主键属性名称与列名称不同,则会出错
允许在运行时定义 EXTRA_SERIALIZERS
在序列化/反序列化嵌套字段时检查是否给出了会话
0.1.0 (2019-02-12)
在 PyPI 上的首次发布。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
serialchemy-1.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 27a052ce966320583e638785acefc1da2f3a054ce6970e06772dbf20a8a6121b |
|
MD5 | c299e24b7824fdba8c2abebcb7083eec |
|
BLAKE2b-256 | d0830a1ecf8f2ce15bc58f123b810c98b4887eec098653dab134853f873bc067 |
serialchemy-1.0.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 47e0b48037cb0fc81c14a6cf14bb1b004e28dd9ce4a84c328c2a2b1e680e1291 |
|
MD5 | 91bcfaf46a709d3bf82fdcf7198ffcf0 |
|
BLAKE2b-256 | 31b76933c50f7a216f3ba421206e6703cfa1f774efbbc2a743dcd8c683813b97 |