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

参考

相关推荐
FreakStudio34 分钟前
不用装软件!这款MicroPython浏览器 IDE :让你在手机上也能调试树莓派 Pico
python·单片机·嵌入式·电子diy·tinyml
didiplus38 分钟前
Python 入门第一课:为什么选择 Python?3 分钟搭建你的第一个程序
后端
dreamxian1 小时前
苍穹外卖day11
java·spring boot·后端·spring·mybatis
m0_743470371 小时前
使用Python进行PDF文件的处理与操作
jvm·数据库·python
华科易迅2 小时前
Spring装配对象方法-注解
java·后端·spring
AwesomeDevin2 小时前
AI时代,我们的任务不应沉溺于与 AI 聊天,🤔 从“对话式编程”迈向“数字软件工厂”
前端·后端·架构
Victor3563 小时前
MongoDB(60)如何使用explain命令?
后端
Victor3563 小时前
MongoDB(59)如何分析查询性能?
后端
数据科学小丫3 小时前
Python 数据存储操作_数据存储、补充知识点:Python 与 MySQL交互
数据库·python·mysql