自动将Odoo模型转换为Datamodels进行(反)序列化
项目描述
本模块利用了在《datamodel》模块中引入的概念,提供类似于(Django REST Framework的子集)的《ModelSerializer》机制。也就是说,使用Odoo模型的定义来部分自动化相应的《Datamodel》类的定义。
目录
使用方法
ModelSerializer
类
ModelSerializer
类从Datamodel
类继承并添加了功能。因此,从ModelSerializer
继承的任何类都可以像任何其他Datamodel
一样使用。
基本用法
以下是一个基本示例
from odoo.addons.model_serializer.core import ModelSerializer class PartnerInfo(ModelSerializer): _name = "partner.info" _model = "res.partner" _model_fields = ["id", "name", "country_id"]
结果等同于以下Datamodel
类
from marshmallow import fields from odoo.addons.datamodel.core import Datamodel from odoo.addons.datamodel.fields import NestedModel class PartnerInfo(Datamodel): _name = "partner.info" id = fields.Integer(required=True, allow_none=False, dump_only=True) name = fields.String(required=True, allow_none=False) country = NestedModel("_auto_nested_serializer.res.country") class _AutoNestedSerializerResCountry(Datamodel): _name = "_auto_nested_serializer.res.country" id = fields.Integer(required=True, allow_none=False, dump_only=True) display_name = fields.String(dump_only=True)
覆盖字段定义
可以像这样覆盖字段的默认定义
from odoo.addons.model_serializer.core import ModelSerializer class PartnerInfo(ModelSerializer): _name = "partner.info" _model = "res.partner" _model_fields = ["id", "name", "country_id"] country_id = NestedModel("country.info") class CountryInfo(ModelSerializer): _name = "country.info" _model = "res.country" _model_fields = ["code", "name"]
在这个示例中,我们覆盖了一个NestedModel
,但它对任何其他字段类型都适用。
(反)序列化
ModelSerializer
负责将Datamodel
实例转换为相应的recordset
,反之亦然,进行繁重的转换工作。
要将记录集转换为(一系列)ModelSerializer
实例(序列化),请执行以下操作
partner_info = self.env.datamodels["partner.info"].from_recordset(partner)
这将返回一个单个实例;如果你的记录集包含多个记录,你可以通过将 many=True
传递给此方法来获取实例列表。
要将 ModelSerializer
实例转换为记录集(反序列化),请执行以下操作
partner = partner_info.to_recordset()
除非找到现有合作伙伴(见下文),否则此方法将在数据库中创建一个新的记录。你可以通过传递 create=False
来避免这种情况,在这种情况下,系统将只在内存中创建它们(NewId
记录集)。
为了确定相应的 Odoo 记录是否已存在或是否应该创建新记录,系统默认会检查实例的 id
字段是否对应数据库记录。此默认行为可以修改如下
class CountryInfo(ModelSerializer): _name = "country.info" _model = "res.country" _model_fields = ["code", "name"] def get_odoo_record(self): if self.code: return self.env[self._model].search([("code", "=", self.code)]) return super().get_odoo_record()
变更日志
14.0.1.0.0
第一个官方版本。
错误跟踪器
错误在 GitHub Issues 上跟踪。如果遇到问题,请先检查是否已报告您的问题。如果您是第一个发现它的,请通过提供详细且受欢迎的 反馈 来帮助我们解决问题。
请勿直接联系贡献者以获取支持或技术问题帮助。
致谢
贡献者
弗朗索瓦·德格雷 <f.degrave@wakari.be>
维护者
此模块由 OCA 维护。
OCA,或 Odoo 社区协会,是一个非营利组织,其使命是支持 Odoo 功能的协作开发并促进其广泛使用。
当前 维护者
此模块是 GitHub 上的 OCA/rest-framework 项目的组成部分。
欢迎您贡献力量。要了解如何贡献,请访问 https://odoo-community.org/page/Contribute。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码发行版
构建发行版
哈希值 for odoo14_addon_model_serializer-14.0.1.0.1-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3de9a1e7d7937999dc583d5ed4b7339339594e1ec88d875b96eff0e51815596a |
|
MD5 | b95ce8e7cf37aaa941bb1c75b1de0f66 |
|
BLAKE2b-256 | 5e94bb08291863c1c23ba24c9b92b258a7c424c601032ad2ce86e31baea596b8 |