自动将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
第一个官方版本。
15.0.1.0.0
第二个版本。
错误跟踪器
错误在GitHub Issues上跟踪。如果遇到问题,请检查是否已报告您的问题。如果是您首先发现的,请通过提供详细且受欢迎的反馈来帮助我们解决。
请不要直接联系贡献者以获取支持或技术问题的帮助。
致谢
贡献者
弗朗索瓦·德格拉夫 <f.degrave@wakari.be>
维护者
此模块由OCA维护。
OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。
当前维护者
此模块是GitHub上的OCA/rest-framework项目的部分。
欢迎您贡献。要了解如何贡献,请访问https://odoo-community.org/page/Contribute。
项目详情
散列用于odoo_addon_model_serializer-15.0.1.2.0.1-py3-none-any.whl
| 算法 | 散列摘要 | |
|---|---|---|
| SHA256 | 43d25212bf0845fda2eeaded392e4be7381d06cc21ce31831f2b06129d50616f |
|
| MD5 | 3b4e796fc3a956d8e4d04226134c25e0 |
|
| BLAKE2b-256 | 23694674deddfa2400a5ef8df4e3fe163c2aba9ce7a23bf004ee90b332356a76 |