Odoo 中的覆盖基方法是好的选择吗?
Is override base method in Odoo is good option?
我在我的自定义模块中创建了一个新方法,我想在用户点击销售订单中的按钮 confirm
时使用我的方法。所以我做了研究并找到了完成这项工作的简单解决方案。
- 覆盖基本方法。在这种情况下,方法
action_confirm()
在 sale.py
中使用 super()
方法。
所以我只是想知道,这是正确的方法吗?还有比这更好的解决方案吗?请给我建议。
覆盖任何方法的最佳方法是使用 super()
,以执行旧功能并避免破坏也会覆盖该源方法的其他模块方法的功能。如果你这样做,你就做得很好。但有时你会发现无法使用super()
的情况,需要复制源代码修改里面的任何东西。在这些情况下,您必须小心并注意您正在覆盖的内容。
Example A
- 您有基本方法
action_confirm()
,它由 sale
模块创建。
- 您安装了一个名为
sale_extension
的模块,它使用 super()
. 覆盖了 action_confirm()
方法
- 然后你安装你的自定义模块,你也用
super()
. 覆盖 action_confirm()
- 当调用
action_confirm()
时,它将执行 sale
、sale_extension
和您的模块功能。
Example B
- 您有基本方法
action_confirm()
,它由 sale
模块创建。
- 您安装了一个名为
sale_extension
的模块,它使用 super()
. 覆盖了 action_confirm()
方法
- 然后你安装你的自定义模块,你也覆盖了
action_confirm()
而没有 super()
,所以你已经复制了 action_confirm()
的源代码并修改了它。
- 调用
action_confirm()
时,它将执行 sale
和您的模块功能,但不会执行 sale_extension
功能。
- 所以你应该先理解,然后在你复制的源代码中加入
sale_extension
引入的代码,然后修改它。
- 这种情况的问题是您可以安装的未来模块,如果它们覆盖
action_confirm()
,您的代码将忽略它们的更改。
所以结论是,如果你使用 super()
,你在安装新模块时不一定会遇到问题(尽管有些情况下即使使用 super()
,你必须修改您的代码以使其适应新安装的模块功能)。
Overiding 用于以下情况:
- 扩展基本功能,通过重新定义方法,调用
使用 super
的 motherclass 方法
- 在需要新行为时替换原来的功能
是的,您可以像这样继承 class "sale.order" 来覆盖该方法:
class SalesOrderExtend(models.Model):
_inherit = "sale.order"
@api.multi
def action_confirm(self):
ret = super(SalesOrderExtend,self).action_confirm()
....
your code
....
return True
)
检查来自 p odoo 的薪资国际化代码中覆盖 superclass 方法的一些示例:
https://github.com/odoo/odoo/blob/11.0/addons/l10n_in_hr_payroll/models/l10n_in_hr_payroll.py
我在我的自定义模块中创建了一个新方法,我想在用户点击销售订单中的按钮 confirm
时使用我的方法。所以我做了研究并找到了完成这项工作的简单解决方案。
- 覆盖基本方法。在这种情况下,方法
action_confirm()
在sale.py
中使用super()
方法。
所以我只是想知道,这是正确的方法吗?还有比这更好的解决方案吗?请给我建议。
覆盖任何方法的最佳方法是使用 super()
,以执行旧功能并避免破坏也会覆盖该源方法的其他模块方法的功能。如果你这样做,你就做得很好。但有时你会发现无法使用super()
的情况,需要复制源代码修改里面的任何东西。在这些情况下,您必须小心并注意您正在覆盖的内容。
Example A
- 您有基本方法
action_confirm()
,它由sale
模块创建。 - 您安装了一个名为
sale_extension
的模块,它使用super()
. 覆盖了 - 然后你安装你的自定义模块,你也用
super()
. 覆盖 - 当调用
action_confirm()
时,它将执行sale
、sale_extension
和您的模块功能。
action_confirm()
方法
action_confirm()
Example B
- 您有基本方法
action_confirm()
,它由sale
模块创建。 - 您安装了一个名为
sale_extension
的模块,它使用super()
. 覆盖了 - 然后你安装你的自定义模块,你也覆盖了
action_confirm()
而没有super()
,所以你已经复制了action_confirm()
的源代码并修改了它。 - 调用
action_confirm()
时,它将执行sale
和您的模块功能,但不会执行sale_extension
功能。 - 所以你应该先理解,然后在你复制的源代码中加入
sale_extension
引入的代码,然后修改它。 - 这种情况的问题是您可以安装的未来模块,如果它们覆盖
action_confirm()
,您的代码将忽略它们的更改。
action_confirm()
方法
所以结论是,如果你使用 super()
,你在安装新模块时不一定会遇到问题(尽管有些情况下即使使用 super()
,你必须修改您的代码以使其适应新安装的模块功能)。
Overiding 用于以下情况:
- 扩展基本功能,通过重新定义方法,调用 使用 super 的 motherclass 方法
- 在需要新行为时替换原来的功能
是的,您可以像这样继承 class "sale.order" 来覆盖该方法:
class SalesOrderExtend(models.Model):
_inherit = "sale.order"
@api.multi
def action_confirm(self):
ret = super(SalesOrderExtend,self).action_confirm()
....
your code
....
return True
)
检查来自 p odoo 的薪资国际化代码中覆盖 superclass 方法的一些示例:
https://github.com/odoo/odoo/blob/11.0/addons/l10n_in_hr_payroll/models/l10n_in_hr_payroll.py