Odoo 15 到 Odoo 19 API 变化完整知识库(详细版)

Odoo 15 到 Odoo 19 API 变化完整知识库(详细版)

概述

本知识库涵盖 Odoo 15.0 到 Odoo 19.0 版本之间的所有主要 API 变化,包括新增功能、废弃功能和重要变更。这些信息可用于 LLM 自动化升级工具的开发。每个变更都关联了具体的PR编号,提供了更详细的技术细节。

详细的版本间 API 变化

Odoo 15.2 (在线版本) - 2022年

新增功能
  • 新的刷新API (PR #87527): 添加了新的API用于刷新到数据库并使缓存失效,并在 odoo.models.Modelodoo.api.Environment 中添加了新方法
重要变更
  • 参数重命名 (PR #83687):
    • search(), search_count()_search()args 参数重命名为 domain
  • 保持记录集顺序 (PR #83687):
    • filtered_domain() 保持当前记录集的顺序
  • 类型变更 (PR #83687):
    • browse() 不再接受 str 类型的ID
  • 字段索引 (PR #83274, PR #83015):
    • 开发者现在可以定义PostgreSQL在字段上使用的索引类型
废弃/移除
  • 方法移除 (PR #82727):
    • fields_get_keys()get_xml_id() 方法被标记为废弃
    • _mapped_cache() 方法被移除
  • 属性移除 (PR #82727):
    • One2many 和 Many2many 的 limit 属性被移除
    • Model 的 _sequence 属性被移除
    • Field 的 column_formatdeprecated 属性被移除
  • 方法行为变更 (PR #82727):
    • _write() 方法不再为不存在的记录引发错误

Odoo 15.3 (在线版本) - 2022年

变更
  • 进一步完善了 argsdomain 的参数重命名 (PR #83687)

Odoo 15.4 (在线版本) - 2022年

新增功能
  • 完善了刷新API功能 (PR #87527)

Odoo 16.0 - 2022年10月

重要变更
  • 翻译存储变更 (PR #97692, PR #101115):
    • 翻译字段的翻译以JSONB值存储
    • 代码翻译不再存储在数据库中,而是从PO文件中静态提取
  • 搜索计数限制 (PR #95589):
    • search_count() 考虑 limit 参数
废弃功能
  • name_get() 方法被标记为废弃,建议读取 display_name 字段 (PR #122085)

Odoo 16.2 (在线版本) - 2023年

变更
  • 搜索和读取方法重构 (PR #112126):
    • 重构了搜索和读取方法的实现,以便在最少数量的SQL查询中结合两者
    • 引入了两个新方法 search_fetch()fetch(),它们利用了这种组合

Odoo 16.3 (在线版本) - 2023年

变更
  • _read_group() 方法具有新的签名 (PR #110737)

Odoo 16.4 (在线版本) - 2023年

变更
  • name_get() 方法正式被标记为废弃,建议读取 display_name 字段 (PR #122085)

Odoo 17.0 - 2023年10月

新增功能
  • SQL包装对象 (PR #134677):
    • 引入了SQL包装对象,使SQL组合更容易且更安全,以防止SQL注入
    • ORM的方法现在在内部使用它

Odoo 17.1 (在线版本) - 2023年

变更
  • _flush_search() 方法被标记为废弃 (PR #144747)

Odoo 17.2 (在线版本) - 2023年

变更
  • 属性重命名 (PR #127353):
    • 字段的 group_operator 属性被重命名为 aggregator
  • 相关字段增强 (PR #127353):
    • 现在可以按相关且不存储的字段进行分组/聚合/排序

Odoo 17.3 (在线版本) - 2023年

新增功能
  • 日期部分编号分组 (PR #159528):
    • 现在可以在 read_group, _read_group 和域中按日期部分编号进行分组

Odoo 17.4 (在线版本) - 2023年

变更
  • 内部操作符移除 (PR #171371):
    • 移除了内部操作符 inselect
    • 替代方案是使用带有 QuerySQL 对象的 in

Odoo 18.0 - 2024年10月

重要变更
  • 名称搜索实现 (PR #174967):
    • 按名称搜索现在通过 _search_display_name 实现
  • 访问权限检查 (PR #179148):
    • 新增方法 check_access, has_access_filtered_access 来结合访问权限和规则
  • 环境中的翻译 (PR #174844):
    • 翻译现在可以通过环境获取

Odoo 18.1 (在线版本) - 2024年

新增功能
  • 新的域API (PR #170009):
    • 引入了新的 odoo.domainodoo.Domain API 用于域操作
  • 模型属性约束和索引 (PR #175783):
    • 可以将约束和索引声明为模型属性
  • JSON控制器重命名 (PR #183636):
    • JSON控制器被重命名为 jsonrpc,但调用方式未变,仅Python文件中的类型发生了变化

Odoo 18.2 (在线版本) - 2024年

变更
  • read_group 废弃 (PR #163300):
    • read_group 被标记为废弃,后端使用 _read_group,公共API使用 formatted_read_group
  • 新的私有API标识 (PR #195402):
    • 添加了 @api.private 用来区分公共Python方法和暴露给RPC调用的方法
  • 原生命名空间 (PR #195664):
    • 支持 odoo 模块 PEP-420 原生命名空间

Odoo 18.3 (在线版本) - 2024年

变更
  • 域优化 (PR #191549):
    • 在执行 Fields.search 方法之前应用域优化。所有等式都被一致处理:=in 等价
  • 新的 cron API (PR #197781):
    • 为批量提交时通知进度引入了新的 cron API
  • 演示数据加载 (PR #194585):
    • 演示数据不再默认加载

Odoo 18.4 (在线版本) - 2024年

新增功能
  • CLI 重新初始化选项 (PR #206408):
    • CLI 添加了 reinit 选项,用于重新初始化模块
  • 自定义域支持 (PR #205208):
    • 支持编写和组合自定义域以注入任意SQL

Odoo 19.0 - 2025年10月

新增功能
  • GROUPING SETS 支持 (PR #194413):
    • 为透视视图添加了对 GROUPING SETS 的支持
  • 动态日期域支持 (PR #216665):
    • 添加了对域中动态日期的支持
  • 新的 ir.config_parameter API (PR #223180):
    • 引入了新的API来处理 ir.config_parameter
  • 新的SQL构建API (PR #234156):
    • 添加了新的API来构建SQL
废弃功能
  • osv 模块废弃 (PR #217708):
    • odoo.osv 模块被标记为废弃
  • 记录属性废弃 (PR #193636):
    • 记录的属性 _cr, _context, 和 _uid 被标记为废弃

Odoo 19.1 (在线版本) - 2025年

新增功能
  • 同 19.0 版本

PR详细信息

以下是各个PR的详细信息:

PR #134677 - SQL包装对象

  • 功能: 引入SQL包装对象,使SQL组合更容易且更安全,以防止SQL注入
  • 影响: ORM的内部方法现在使用这种新的SQL包装对象
  • 安全增强: 显著提高了SQL查询的安全性

PR #174967 - 按名称搜索实现

  • 功能 : 按名称搜索现在通过 _search_display_name 实现
  • 一致性: 将名称搜索与其他字段的处理方式统一
  • 影响: 改进了搜索性能和一致性

PR #179148 - 访问权限检查方法

  • 功能 : 新增 check_access, has_access_filtered_access 方法
  • 组合权限: 这些方法组合了访问权限和规则的检查
  • 影响: 简化了访问权限的处理逻辑

PR #174844 - 环境中的翻译

  • 功能: 翻译现在可以通过 Environment 获取
  • 改进 : 使用 Environment._ 函数进行翻译,不再需要检查调用堆栈
  • 影响: 提高了翻译处理的效率和可靠性

PR #223180 - 新的 ir.config_parameter API

  • 功能: 引入了新的API来处理系统配置参数
  • 影响: 提供了更现代和一致的方式来处理配置参数

PR #234156 - 新的SQL构建API

  • 功能: 添加了新的API来构建SQL查询
  • 推荐方式: 推荐使用SQL包装对象来构建查询
  • 影响: 提供了更安全和灵活的SQL构建方式

PR #217708 - 废弃 odoo.osv 模块

  • 功能: 将 odoo.osv 模块标记为废弃
  • 影响: 开发者应停止使用该模块,改用其他API
  • 警告: 使用时会发出弃用警告

PR #193636 - 废弃记录属性

  • 功能 : 废弃了记录的 _cr, _context, 和 _uid 属性
  • 新方式 : 建议使用 self.env.cr, self.env.context, self.env.uid
  • 影响: 鼓励使用环境对象来访问这些资源

PR #83687 - 参数重命名

  • 功能 : 将 search(), search_count()_search()args 参数重命名为 domain
  • 一致性: 使参数名称更符合其用途
  • 影响: 提高了API的可读性和一致性

PR #122085 - name_get 方法废弃

  • 功能 : 将 name_get() 方法标记为废弃
  • 新方式 : 建议读取 display_name 字段
  • 影响: 统一了名称获取的方式

自动化升级规则

规则 1: 参数重命名 (PR #83687)

python 复制代码
# 从 Odoo 15.3 开始,args 参数重命名为 domain
# 旧代码:
# Model.search(args=[('name', '=', 'test')])

# 新代码:
# Model.search(domain=[('name', '=', 'test')])

规则 2: 方法废弃处理 (PR #122085)

python 复制代码
# 对于 Odoo 16.0+,name_get() 方法被标记为废弃
# 旧代码:
# name = record.name_get()[0][1]

# 新代码:
# name = record.display_name

规则 3: 字段属性变更 (PR #127353)

python 复制代码
# Odoo 17.2+ 中,group_operator 重命名为 aggregator
# 旧代码:
# total = fields.Float(group_operator='sum')

# 新代码:
# total = fields.Float(aggregator='sum')

规则 4: 翻译存储变更 (PR #97692, PR #101115)

python 复制代码
# Odoo 16.0+ 中,翻译字段存储方式改变
# 需要更新相关代码以适配 JSONB 存储格式

规则 5: 废弃的记录属性处理 (PR #193636)

python 复制代码
# Odoo 19.0+ 中,_cr, _context, _uid 属性被废弃
# 旧代码:
# cr = self._cr
# context = self._context
# uid = self._uid

# 新代码:
# cr = self.env.cr
# context = self.env.context
# uid = self.env.uid

规则 6: read_group 方法处理 (PR #163300)

python 复制代码
# Odoo 18.2+ 中,read_group 被废弃
# 旧代码:
# Model.read_group(domain, fields, groupby)

# 新代码:
# 使用 formatted_read_group 或 _read_group

规则 7: 搜索和读取方法优化 (PR #112126)

python 复制代码
# Odoo 16.2+ 中,引入了 search_fetch 和 fetch 方法
# 用于在一次查询中完成搜索和读取

规则 8: SQL包装对象使用 (PR #134677)

python 复制代码
# Odoo 17.0+ 中,推荐使用SQL包装对象
# 旧代码:
# self.env.cr.execute("SELECT * FROM table WHERE id = %s" % some_id)

# 新代码:
# from odoo.tools import SQL
# query = SQL("SELECT * FROM table WHERE id = %s", some_id)
# self.env.cr.execute(query)

版本升级路径建议

从 Odoo 15 到 Odoo 16

  1. 更新代码中 args 参数为 domain (PR #83687)
  2. 替换 name_get() 调用为 display_name 属性 (PR #122085)
  3. 移除对已废弃方法和属性的使用 (PR #82727)
  4. 更新翻译相关代码以适配 JSONB 存储 (PR #97692, PR #101115)

从 Odoo 16 到 Odoo 17

  1. 更新 SQL 查询代码以使用新的 SQL 包装对象 (PR #134677)
  2. 修改相关的分组/聚合/排序逻辑 (PR #127353)

从 Odoo 17 到 Odoo 18

  1. 更新搜索实现相关的代码 (PR #174967)
  2. 更新访问权限检查代码 (PR #179148)
  3. 更新翻译相关的代码 (PR #174844)
  4. 添加 @api.private 装饰器到私有方法 (PR #195402)

从 Odoo 18 到 Odoo 19

  1. 更新使用废弃的 _cr, _context, _uid 属性的代码 (PR #193636)
  2. 废弃对 odoo.osv 模块的使用 (PR #217708)
  3. 利用新的 GROUPING SETS 功能 (PR #194413)

自动化检测脚本模板

python 复制代码
def detect_odoo_api_changes(file_content, from_version, to_version):
    """
    检测 Odoo API 变化
    """
    issues = []
    
    # 检测参数重命名 (PR #83687)
    if 'args=[' in file_content and from_version < '15.3':
        issues.append({
            'type': 'param_rename',
            'message': 'args parameter should be renamed to domain (PR #83687)',
            'location': find_line_number(file_content, 'args=['),
            'pr_number': '83687'
        })
    
    # 检测废弃方法 (PR #122085)
    if 'name_get()' in file_content and from_version < '16.0' and to_version >= '16.0':
        issues.append({
            'type': 'deprecated_method',
            'message': 'name_get() is deprecated, use display_name instead (PR #122085)',
            'location': find_line_number(file_content, 'name_get()'),
            'pr_number': '122085'
        })
    
    # 检测废弃属性 (PR #193636)
    for attr in ['_cr', '_context', '_uid']:
        if f'self.{attr}' in file_content and from_version < '19.0' and to_version >= '19.0':
            issues.append({
                'type': 'deprecated_attribute',
                'message': f'{attr} is deprecated in Odoo 19.0+ (PR #193636)',
                'location': find_line_number(file_content, f'self.{attr}'),
                'pr_number': '193636'
            })
    
    # 检测SQL直接拼接 (PR #134677)
    if 'execute("' in file_content or "execute('" in file_content:
        issues.append({
            'type': 'sql_injection_risk',
            'message': 'Direct string concatenation in SQL execute calls is risky, use SQL wrapper objects (PR #134677)',
            'location': find_line_number(file_content, 'execute('),
            'pr_number': '134677'
        })
    
    return issues

def apply_fixes(file_content, issues):
    """
    应用修复
    """
    content = file_content
    
    for issue in issues:
        if issue['type'] == 'param_rename' and issue['pr_number'] == '83687':
            content = content.replace('args=[', 'domain=[')
        elif issue['type'] == 'deprecated_method' and issue['pr_number'] == '122085':
            # 复杂的替换需要更智能的AST解析
            content = replace_name_get_with_display_name(content)
        elif issue['type'] == 'deprecated_attribute' and issue['pr_number'] == '193636':
            # 替换废弃属性
            content = replace_deprecated_attributes(content)
        elif issue['type'] == 'sql_injection_risk' and issue['pr_number'] == '134677':
            # 提醒使用新的SQL包装对象
            content = replace_with_sql_wrapper(content)
    
    return content

重要注意事项

  1. 安全性增强 (PR #134677):

    • 从 Odoo 17 开始引入了 SQL 包装对象,提升了安全性
    • 代码中直接的 SQL 字符串拼接需要更新为使用安全的 SQL 构建方法
  2. 性能优化:

    • 多个版本引入了性能优化,如搜索和读取方法的重构 (PR #112126)
    • 开发者应利用新的 API 以获得更好的性能
  3. 向后兼容性:

    • 虽然有废弃的 API,但大多数旧代码在新版本中仍然可以运行一段时间
    • 但建议及时更新以避免未来的兼容性问题
  4. 测试验证:

    • 升级后需对所有自定义模块进行全面测试
    • 特别关注数据库迁移和数据一致性
  5. PR关联的变更追踪:

    • 每个API变更都与相应的PR编号关联,便于追踪变更历史
    • 开发者可以查阅对应的PR以获取更详细的技术细节

这个详细的完整知识库为 LLM 自动化升级工具提供了详尽的 API 变化参考,包括每个版本的具体变更、废弃的 API、新增功能以及相应的修复规则。每个变更都关联了具体的PR编号,便于进一步研究和验证。

摘自:jeffery #Odoo企业管理软件#

相关推荐
odoo中国5 天前
Odoo 19 中的基础视图有哪些?
odoo·odoo19·基础视图
odoo中国10 天前
Odoo 18 会计模块中的在产品(WIP)账户概述
odoo18·在产品·成本核算·会计成本核算
朱元禄7 个月前
ubuntu服务器上极简部署odoo18
odoo18·生成环境发布odoo
odoo-卜永9 个月前
odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程
自动化·制造·实施·odoo18
Mr.E51 年前
odoo 17 后端路由接口认证自定义
odoo·odoo17·odoo后端
Mr.E51 年前
odoo17 owl 前端 顶部导航栏右侧添加自定义按钮
前端·odoo·odoo17·owl
加菲大叔1 年前
win10下用vscode和pycharm运行odoo18的速度对比
vscode·pycharm·odoo18
加菲大叔1 年前
ubuntu2404下搭建Odoo18开发环境
odoo·odoo18
加菲大叔2 年前
odoo17核心概念view4——view.js
odoo·odoo17·owl