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

参考

相关推荐
陈苏同学12 分钟前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
唐家小妹15 分钟前
介绍一款开源的 Modern GUI PySide6 / PyQt6的使用
python·pyqt
杨哥带你写代码28 分钟前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
羊小猪~~1 小时前
深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)
pytorch·python·rnn·深度学习·机器学习·数据分析·lstm
A尘埃1 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23071 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code1 小时前
(Django)初步使用
后端·python·django
代码之光_19801 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
985小水博一枚呀1 小时前
【对于Python爬虫的理解】数据挖掘、信息聚合、价格监控、新闻爬取等,附代码。
爬虫·python·深度学习·数据挖掘
编程老船长1 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb