跳至内容

Odoo 18 和 Odoo 17 的主要区别

开发部分

界面

Debug Menu 可以直接访问 Model


后端


  1. 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... 的形式)





 
Odoo
对接 DHL 经验记录