Skip to main content

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

项目描述

Α 许可证:LGPL-3 OCA/休息框架 在 Weblate 上翻译我 试试我的 Runbot

该模块利用数据模型模块中引入的概念来提供类似于Django REST 框架中的ModelSerializer (的子集)的机制。也就是说,使用 Odoo 模型的定义来部分自动化相应Datamodel类的定义。

目录

<nav class="contents local" id="contents" role="doc-toc"> </nav>

用法

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")

类 CountryInfo(ModelSerializer):
    _name = "国家信息"
    _model = "res.country"
    _model_fields = [“代码”,“名称”]

在此示例中,我们覆盖了 aNestedModel但它对任何其他字段类型的工作方式相同。

(反)序列化

ModelSerializerDatamodel完成将实例转换为对应 的所有繁重工作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 问题上跟踪错误。如果遇到问题,请检查您的问题是否已被报告。如果您首先发现它,请通过提供详细且受欢迎的 反馈来帮助我们粉碎它。

不要就技术问题的支持或帮助直接联系贡献者。

学分

作者

  • 若里

贡献者

维护者

该模块由 OCA 维护。

Odoo 社区协会

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

当前维护者

fdegrave

该模块是GitHub 上OCA/rest-framework项目的一部分。

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

项目详情


下载文件

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

内置分布

odoo14_addon_model_serializer-14.0.1.0.1-py3-none-any.whl (32.5 kB 查看哈希

已上传 py3