跳转到主要内容

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

项目描述

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

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

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

致谢

作者

  • Wakari

贡献者

维护者

此模块由 OCA 维护。

Odoo Community Association

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

当前 维护者

fdegrave

此模块是 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 状态页面