跳转到主要内容

提供对ORM中所有模型进行jsonify方法的基模块

项目描述

Beta License: LGPL-3 OCA/server-tools Translate me on Weblate Try me on Runbot

此模块为ORM的每个模型添加了一个“jsonify”方法。它作用于当前记录集,并需要一个名为“parser”的单个参数,用于指定要提取的字段。

简单解析器的示例

parser = [
    'name',
    'number',
    'create_date',
    ('partner_id', ['id', 'display_name', 'ref'])
    ('line_id', ['id', ('product_id', ['name']), 'price_unit'])
]

为了与Odoo API保持一致,jsonify方法始终返回一个对象列表,即使记录集中只有一个元素。

默认情况下,JSON中的键是模型中提取的字段名称。如果您需要指定用作键的备用名称,您可以在解析器定义中定义您的映射,如下所示

parser = [
    'field_name:json_key'
]
parser = [
    'name',
    'number',
    'create_date:creationDate',
    ('partner_id:partners', ['id', 'display_name', 'ref'])
    ('line_id:lines', ['id', ('product_id', ['name']), 'price_unit'])
]

如果您需要以自定义方式解析字段的值,您可以传递一个可调用对象或模型上的方法名称

parser = [
    ('name', "jsonify_name")  # method name
    ('number', lambda rec, field_name: rec[field_name] * 2))  # callable
]

此外,该模块在ir.exports对象上提供了一个名为“get_json_parser”的方法,该方法从ir.exports配置生成解析器。

对于高级用途,该模块还提供了更多功能。它定义了一个简单的“resolver”模型,该模型具有“python_code”字段和resolve函数,因此可以配置任意函数来转换字段或处理结果字典。还可以指定一个语言来提取任何给定字段的翻译。

要使用这些功能,完整的解析器应遵循以下结构

parser = {
    "resolver": 3,
    "language_agnostic": True,
    "langs": {
        False: [
            {'name': 'description'},
            {'name': 'number', 'resolver': 5},
            ({'name': 'partner_id', 'target': 'partner'}, [{'name': 'display_name'}])
        ],
        'fr_FR': [
            {'name': 'description', 'target': 'descriptions_fr'},
            ({'name': 'partner_id', 'target': 'partner'}, [{'name': 'description', 'target': 'description_fr'}])
        ],
    }
}

将得到具有此结构的结果(注意,翻译的字段合并到同一个字典中)

exported_json == {
    "description": "English description",
    "description_fr": "French description, voilà",
    "number": 42,
    "partner": {
        "display_name": "partner name",
        "description_fr": "French description of that partner",
    },
}

请注意,解析器可以以记录集或ID的形式传递,以便完全可序列化。在不需要字段翻译的情况下,有一个稍微简单一些的版本,但其他功能,如自定义解析器,也有

parser = {
    "resolver": 3,
    "fields": [
            {'name': 'description'},
            {'name': 'number', 'resolver': 5},
            ({'name': 'partner_id', 'target': 'partners'}, [{'name': 'display_name'}]),
    ],
}

通过传递fields键而不是langs键,我们本质上具有与简单解析器相同的行为,同时增加了使用解析器的便利。

解析器的标准用例包括:- 提供特定字段的默认值(例如,使用“”而不是None)- 转换字段类型(例如,使用int())- 将特定字段别名为特定导出- …

简单的解析器在导出时被转换为完整的解析器。

如果提供了全局解析器,那么json_dict将经过

resolver.resolve(dict, record)

这允许添加来自上下文的外部数据或在必要时转换字典。类似地,如果为字段提供了解析器,解析器将评估结果。

一个目标可以通过以‘=list’结尾来拥有一个打包器:在这种情况下,结果将放入一个列表中。

parser = {
    fields: [
        {'name': 'name'},
        {'name': 'field_1', 'target': 'customTags=list'},
        {'name': 'field_2', 'target': 'customTags=list'},
    ]
}

这将导致以下JSON结构

{
    'name': 'record_name',
    'customTags': ['field_1_value', 'field_2_value'],
}

预期用例是与需要同时导出所有翻译参数的API兼容,并要求将自定义属性放入子字典中。由于这些要求中的某些通常是可选的,因此可以在不添加字段或更改任何代码的情况下满足新要求。

请注意,使用简单解析器导出的值取决于记录的lang;这与旨在语言无关的完整解析器形成对比。

目录

错误跟踪器

错误在GitHub Issues上进行跟踪https://github.com/OCA/server-tools/issues。如果在那里有问题,请检查是否已报告。如果您是第一个发现它的人,请通过提供详细且受欢迎的反馈来帮助我们解决这个问题。

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

鸣谢

作者

  • Akretion

贡献者

维护者

该模块由OCA维护。

Odoo Community Association

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

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

欢迎您贡献力量。有关如何贡献的信息,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

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

源代码分发

本版本没有提供源代码分发文件。请参阅关于生成分发存档的教程。

构建的分发

由以下支持