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"属性

参考

相关推荐
2201_756847331 分钟前
HTML函数在老旧浏览器运行慢是硬件问题吗_软硬协同分析【教程】
jvm·数据库·python
雨墨✘17 分钟前
CSS如何提高团队协作效率_推广BEM规范减少样式沟通成本
jvm·数据库·python
hef28822 分钟前
如何实现SQL字段值的计算输出:算术运算符与别名结合
jvm·数据库·python
程序员张322 分钟前
自定义跨字段校验必填注解
java·后端
2401_8274999923 分钟前
python项目实战11-正则表达式基础
python·mysql·正则表达式
小糖学代码33 分钟前
LLM系列:1.python入门:6.元组型对象(tuple)
linux·运维·服务器·python
ZC跨境爬虫33 分钟前
Scrapy实战:5sing原创音乐网多页数据爬取(完整可运行,附避坑指南)
爬虫·python·scrapy·html
那个失眠的夜35 分钟前
Spring 的纯注解配置
xml·java·数据库·后端·spring·junit
Rust研习社37 分钟前
Rust 堆内存指针 Box 详解
开发语言·后端·rust
ffqws_40 分钟前
Spring Boot:用JWT令牌和拦截器实现登录认证(含测试过程和关键注解讲解)
java·spring boot·后端