Odoo17代码变更

Odoo在版本变更时,代码会出现一些变更,如果不注意,在新版本中使用旧的方式进行开发,就会出现问题。本篇文章结合OCA社区的版本迁移指南,对Odoo16到Odoo17版本变更时,在开发中需要注意的问题进行说明。Odoo11~Odoo16各个版本代码的变更请参考这篇文章

Python代码

弃用name_get

在之前的Odoo版本中模型的display_name字段与name_get方法具有类似的用处,两者同时存在容易引起开发者的混淆。

Odoo16中为display_name字段赋值

py 复制代码
@api.depends(lambda self: (self._rec_name,) if self._rec_name else ())
def _compute_display_name(self):
    names = dict(self.name_get())
    for record in self:
        record.display_name = names.get(record.id)

之前的版本中通过复写name_get方法来改变display_name字段的值(Odoo14中推荐的写法),在Odoo17中由于name_get方法弃用,需要复写_compute_display_name方法。

res.partner模型中使用complete_name字段来实现display_name字段的功能

py 复制代码
# Odoo16 res.partner
display_name = fields.Char(compute='_compute_display_name', recursive=True, store=True, index=True)

# Odoo17 res.partner的display_name字段的计算依赖于context中的属性,作为存储字段是没有意义的
complete_name = fields.Char(compute='_compute_complete_name', store=True, index=True)

@api.depends('complete_name', ...)
@api.depends_context('show_address', 'partner_show_db_id', ...)
def _compute_display_name(self):
    ...

模块钩子参数改变

模块钩子pre_init_hook, post_init_hook、 uninstall_hook接收的参数从cr, registry变为env

py 复制代码
# Odoo16写法
def post_init_hook(cr, registry):
    ...
    
# Odoo17写法
def post_init_hook(env):
    ...

弃用get_resource_path与get_module_resource

使用file_path方法来替代get_resource_path,使用file_open来替代open。两个新方法都增加了安全检查,保证操作的文件位于addons_path目录下。

py 复制代码
with file_open(manifest_path, 'rb', env=self.env) as f:
    terp.update(ast.literal_eval(f.read().decode()))

XML代码

规范contextactive_*属性的用法

active_*属性在Odoo18中将会被移除(参考),在Odoo17中仍然支持这些属性,但是会得到一个警告。现在需要使用替代方法来实现之前active_*的功能,为之后的版本更新做好准备。

使用id来替代active_id

使用硬编码来替换active_model

active_ids并没有合适的方案,尽量使用其他的方式来达到你的需求

不再使用attrsstates属性

在之前的版本中,如果需要对一个字段进行隐藏,有多种方式可以实现:

  • <field name="total" attrs="{'invisible': [('name', '=', 'red')]}"/>
  • <field name="total" invisible="True"/>
  • <field name="total" invisible="1"/>
  • <field name="total" invisible="not context.get('show_me')"/>

在Odoo17中对这些写法进行了简化

xml 复制代码
<field name="field_a" readonly="not context.get('show_a')" attrs="{'readonly': [('field_b', '!=', False), ('field_c', '=', parent.c)]}"/>
<field name="field_b" states="draft"/>

在Odoo17中替换为下列写法

xml 复制代码
<field name="field_a" readonly="not context.get('show_a') or field_b and field_c == parent.c"/>
<field name="field_b" invisible="state != 'draft'"/>

继承写法的变化

xml 复制代码
<field name="field_a" readonly="not context.get('show_a')" attrs="{'invisible': [('field_b', '!=', False)]}"/>
<field name="field_a" position="attributes">
    <attribute name="attrs">{'readonly': [('field_c', '=', False)], 'invisible': [('field_d', '!=', '3')]}</attribute>
</field>

Odoo17使用这种写法

xml 复制代码
<field name="field_a" readonly="not context.get('show_a')" invisible="field_b"/>

<field name="field_a" position="attributes">
    <!-- 与表达式not context.get('show_a') 做或运算-->
    <attribute name="readonly" add="(not field_c)" separator=" or "/>
    <attribute name="invisible">field_d != 3</attribute>
</field>

tree视图invisible属性的变化

Odoo17中tree视图的字段如果使用invisible="1"属性来修饰,会显示表头,但是字段的值都是空。如果要完全隐藏一列,使用column_invisible="1"属性。

OWL模板移除owl="1"属性

参考

相关推荐
神仙别闹20 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
无责任此方_修行中20 小时前
一行代码的“法律陷阱”:开发者必须了解的开源许可证知识
前端·后端·开源
hongjianMa20 小时前
【论文阅读】Hypercomplex Prompt-aware Multimodal Recommendation
论文阅读·python·深度学习·机器学习·prompt·推荐系统
合作小小程序员小小店20 小时前
web网页开发,在线物流管理系统,基于Idea,html,css,jQuery,jsp,java,SSM,mysql
java·前端·后端·spring·intellij-idea·web
用户214118326360221 小时前
Claude Skills 新玩法:用 skill-creator 10 分钟搞定 Excel 报表自动化,职场人必学
后端
饼干,21 小时前
第23天python内容
开发语言·python
東雪木21 小时前
Spring Boot 2.x 集成 Knife4j (OpenAPI 3) 完整操作指南
java·spring boot·后端·swagger·knife4j·java异常处理
天使街23号1 天前
go-dongle v1.2.0 发布,新增 SM2 非对称椭圆曲线加密算法支持
开发语言·后端·golang
酷柚易汛智推官1 天前
基于librespot的定制化Spotify客户端开发:开源替代方案的技术实践与优化
python·开源·酷柚易汛
雪碧聊技术1 天前
requests入门
python·requests·请求头的user-agent