跳转到主要内容

自动将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()

变更日志

14.0.1.0.0

第一个官方版本。

15.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

项目详情


下载文件

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

源代码分布

此版本没有提供源代码分布文件。有关教程,请参阅生成分布存档

构建分布

odoo_addon_model_serializer-15.0.1.2.0.1-py3-none-any.whl (33.2 kB 查看散列)

上传时间: Python 3

支持者

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