据我所知,odoo不会扩展其模型,因为Python扩展了它的类(_inherit = 'model'
。这看起来很合理。我的问题是:
如果我customModule1
扩展sale.order
并覆盖添加某些功能的write
方法,我稍后会安装customModule2
,后者会扩展sale.order
模型,覆盖write
方法添加一些功能我也理解write
方法的所有版本都会被调用但是按顺序调用?
当客户端在write
模型上写入时,customModule1
的{{1}}会先被调用吗?或sale.order
的{{1}}?
答案 0 :(得分:2)
最后安装模块的
write
将首先调用 。
write
的{{1}}将首先调用(因为它上次安装),如果您在写入时调用了超级,则基于超级位置写入customModule1将被调用。
customModule2
OR
@api.multi
def write(self, vals):
res = super(product_product, self).write(vals)
# do your work after super call
return res
答案 1 :(得分:1)
是的,这是非常有趣的一点,没有人可以预测哪个模块首先调用哪个方法,因为odoo管理依赖的层次结构。
调用模式仅在方法出现时进入图片 从对象调用(从代码手动)和从UI调用方法调用 (表示从UI编辑销售订单)然后它将调用每个写入方法 为该模型编写,无论它在哪个模块中,它都是 序列是最后的书面呼叫(但只有当方法是 从UI调用。)
因此,在您的情况下,自定义模块1 和自定义模块2 将处于同一级别,并且两者具有相同的父销售订单。< / p>
销售订单=&gt;自定义模块1(写入方法覆盖)
销售订单=&gt;自定义模块2(写入方法覆盖)
因此,虽然将从代码手动调用write方法,然后它 将优先考虑本地模块,然后它将调用super 方法
在这种情况下,假设从模块1 调用写入方法,那么它可能会忽略模块2 的写入方法,因为模块1和模块2都打开了相同级别(超级将被称为父类的写方法)。因为我们在开发中已经多次面对这个问题,在多个模块上覆盖的方法和它们在同一级别上,所以它不会调用下一个模块的方法。
因此,当您需要调用每个模块的每个方法时,它们必须处于层次结构中,但不能处于同一级别。
因为主要原因是并行模块不会多次调用该方法。
因为这里有两件事情,
1)。 依赖:父模块(决定模块层次结构)
2)。 _inherit :这里定义了对象的方法和行为。
模块1和模块2不在彼此的依赖中 层次结构没有必要从这两个模块调用方法 无论它们是否覆盖相同模型的相同方法。