开发部分
界面
Debug Menu 可以直接访问 Model


后端
- Chatter(消息记录)
-
Odoo 17:
<div class="oe_chatter"> <field name="message_follower_ids"/> <field name="activity_ids"/> <field name="message_ids"/> </div>
-
Odoo 18:
<chatter/>
简化写法,统一调用。
2. 树/列表视图(Tree/List View)
-
Odoo 17:
使用 <tree>,如下所示:<tree editable="bottom" create="false"> <field name="employee_id" column_invisible="1"/> <field name="filename" column_invisible="1"/> <field name="finger_id" create="false" edit="false"/> <field name="finger_template" create="false" widget="binary" filename="filename"/> </tree> <field name="view_mode">tree</field>
-
Odoo 18:
改为 <list>:<list> <field name="name"/> <field name="widget_type"/> <field name="size_x"/> <field name="size_y"/> <field name="sequence" widget="handle"/> </list> <field name="view_mode">list</field>
3. 计划任务的变更(Scheduled Actions)
-
Odoo 17:
包含 numbercall 字段。 -
Odoo 18:
移除 numbercall 字段,简化配置。
4. 只读装饰器(@readonly)
- Odoo 17:无该装饰器
-
Odoo 18:新增 @api.readonly
@api.readonly def activity_format(self): return Store(self).get_result()
5. 名称搜索
- Odoo 17:使用 _name_search
- Odoo 18:使用 _search_display_name,支持更灵活的字段搜索
6. 权限检查(访问规则)
- Odoo 17:需分开调用 check_access_rights 与 check_access_rule
- Odoo 18:统一为 check_access(),新增 has_access() 方法,支持 _filtered_access() 替代原先多个方法
7. 翻译函数 _()
- Odoo 17:依赖堆栈分析
- _() 函数使用了 调用堆栈 来推断当前模块(module)和上下文。
-
在某些复杂环境(如多模块继承、异步线程)中,堆栈分析可能不准确,会导致:
- 模块识别错误 ➜ 无法找到翻译
- 用户语言识别异常 ➜ 显示为英文
- 可能问题:
- 当代码运行在一个动态导入模块中时,_() 获取到的模块名是错误的,因此翻译无效。
- 当执行一个后台队列任务(如 queue_job)时,用户上下文丢失,语言不再是用户设置的语言,而是默认语言。
- Odoo 18:使用 env._(),配合 LazyTranslate 提高性能与准确性
msg = self.env._("Order %s cannot be cancelled", order.name)- 这个信息直到被展示(如在界面、日志、邮件模板中)时才真正翻译,保证:
- 翻译使用的是用户当前语言
- 多语言切换不需要重启系统或刷新缓存
8. _search 函数中 SQL 语法改进
- Odoo 17:使用内部 inselect 操作符
- Odoo 18:改为标准 SQL 的 IN,可读性与性能更优
9. 报表中的日期粒度
- Odoo 17:仅支持年、季、月、周、日
- Odoo 18:新增 month_number、quarter_number、week_number,支持跨年聚合、分组
10. 相关字段的分组与排序(Related Field)
- Odoo 17:相关字段必须存储(store=True)才能分组/聚合/排序
- Odoo 18:支持未存储字段(需 related_sudo=True or compute_sudo=True),group_operator改名为aggregator
allocated_percentage = fields.Float( string="Allocated Time (%)", readonly=True, aggregator="avg" # 这个字段可以参与平均值计算 )- 底层修改了已有的 _description_sortable 和 _description_group_operator 方法,以便它们能够考虑非存储的字段。
11. _flush_search() 方法弃用
- Odoo 17:用于在搜索时刷新字段
- Odoo 18:弃用该方法,由 execute_query() 接管
12. JS 中 RPC 方法
-
Odoo 17:使用 jsonrpc
import { jsonrpc } from "@web/core/network/rpc_service"; -
Odoo 18:简化为 rpc
import { rpc } from "@web/core/network/rpc";
13. url 变化
i. 可读性更好,支持手动编辑,提升了网站的可用性和 SEO 效果
ii.
14. __manifest__
i. 重新支持 4 位版本号(17 版本精简了大版本号,只能 ‘x.y’,‘x.y.z’,18又改了回来,支持 18.x... 的形式)
i. 重新支持 4 位版本号(17 版本精简了大版本号,只能 ‘x.y’,‘x.y.z’,18又改了回来,支持 18.x... 的形式)