自动将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()
变更日志
13.0.1.0.0
第一个官方版本。
错误跟踪器
错误在GitHub Issues上跟踪。如果遇到问题,请检查是否已报告您的问题。如果您是第一个发现的,请通过提供详细且受欢迎的反馈来帮助我们解决它。
请勿直接联系贡献者以获取支持或技术问题的帮助。
致谢
贡献者
弗朗索瓦·德格雷 <f.degrave@wakari.be>
维护者
此模块由OCA维护。
OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛应用。
此模块是GitHub上的OCA/rest-framework项目的组成部分。
欢迎您贡献力量。要了解如何操作,请访问https://odoo-community.org/page/Contribute。
项目详情
odoo13_addon_model_serializer-13.0.1.0.1.dev18-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9f1d446e40ec1eeebf7f89158d60ed7a2c4e6c6c7de9e3db3f3141332493220c |
|
MD5 | 3eb6b92f718bcf73ef72e53366346767 |
|
BLAKE2b-256 | 8e097e2ad3eee1e610ae91744aac6147970ab5ff01e922c85520818f98c9f379 |