Odoo覆盖函数调用顺序

时间:2016-06-02 14:40:02

标签: python openerp

据我所知,odoo不会扩展其模型,因为Python扩展了它的类(_inherit = 'model'。这看起来很合理。我的问题是:

如果我customModule1扩展sale.order并覆盖添加某些功能的write方法,我稍后会安装customModule2,后者会扩展sale.order模型,覆盖write方法添加一些功能我也理解write方法的所有版本都会被调用但是按顺序调用?

当客户端在write模型上写入时,customModule1的{​​{1}}会先被调用吗?或sale.order的{​​{1}}?

2 个答案:

答案 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不在彼此的依赖中   层次结构没有必要从这两个模块调用方法   无论它们是否覆盖相同模型的相同方法。