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.Model和odoo.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_format和deprecated属性被移除
- One2many 和 Many2many 的
- 方法行为变更 (PR #82727):
_write()方法不再为不存在的记录引发错误
Odoo 15.3 (在线版本) - 2022年
变更
- 进一步完善了
args到domain的参数重命名 (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 - 替代方案是使用带有
Query或SQL对象的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.domain和odoo.DomainAPI 用于域操作
- 引入了新的
- 模型属性约束和索引 (PR #175783):
- 可以将约束和索引声明为模型属性
- JSON控制器重命名 (PR #183636):
- JSON控制器被重命名为
jsonrpc,但调用方式未变,仅Python文件中的类型发生了变化
- JSON控制器被重命名为
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选项,用于重新初始化模块
- CLI 添加了
- 自定义域支持 (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
- 引入了新的API来处理
- 新的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
- 更新代码中
args参数为domain(PR #83687) - 替换
name_get()调用为display_name属性 (PR #122085) - 移除对已废弃方法和属性的使用 (PR #82727)
- 更新翻译相关代码以适配 JSONB 存储 (PR #97692, PR #101115)
从 Odoo 16 到 Odoo 17
- 更新 SQL 查询代码以使用新的 SQL 包装对象 (PR #134677)
- 修改相关的分组/聚合/排序逻辑 (PR #127353)
从 Odoo 17 到 Odoo 18
- 更新搜索实现相关的代码 (PR #174967)
- 更新访问权限检查代码 (PR #179148)
- 更新翻译相关的代码 (PR #174844)
- 添加
@api.private装饰器到私有方法 (PR #195402)
从 Odoo 18 到 Odoo 19
- 更新使用废弃的
_cr,_context,_uid属性的代码 (PR #193636) - 废弃对
odoo.osv模块的使用 (PR #217708) - 利用新的 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
重要注意事项
-
安全性增强 (PR #134677):
- 从 Odoo 17 开始引入了 SQL 包装对象,提升了安全性
- 代码中直接的 SQL 字符串拼接需要更新为使用安全的 SQL 构建方法
-
性能优化:
- 多个版本引入了性能优化,如搜索和读取方法的重构 (PR #112126)
- 开发者应利用新的 API 以获得更好的性能
-
向后兼容性:
- 虽然有废弃的 API,但大多数旧代码在新版本中仍然可以运行一段时间
- 但建议及时更新以避免未来的兼容性问题
-
测试验证:
- 升级后需对所有自定义模块进行全面测试
- 特别关注数据库迁移和数据一致性
-
PR关联的变更追踪:
- 每个API变更都与相应的PR编号关联,便于追踪变更历史
- 开发者可以查阅对应的PR以获取更详细的技术细节
这个详细的完整知识库为 LLM 自动化升级工具提供了详尽的 API 变化参考,包括每个版本的具体变更、废弃的 API、新增功能以及相应的修复规则。每个变更都关联了具体的PR编号,便于进一步研究和验证。
摘自:jeffery #Odoo企业管理软件#