跳转到主要内容

自动将Odoo模型转换为Datamodels进行序列化和反序列化

项目描述

Alpha License: LGPL-3 OCA/rest-framework Translate me on Weblate Try me on Runboat

此模块利用在“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上跟踪。如果遇到问题,请检查是否已报告您的问题。如果您是第一个发现的,请通过提供详细且受欢迎的反馈来帮助我们解决它。

请勿直接联系贡献者以获取支持或技术问题的帮助。

致谢

作者

  • Wakari

贡献者

维护者

此模块由OCA维护。

Odoo Community Association

OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛应用。

此模块是GitHub上的OCA/rest-framework项目的组成部分。

欢迎您贡献力量。要了解如何操作,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅生成分发归档的教程。

构建分发

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面