Odoo 中的覆盖基方法是好的选择吗?

Is override base method in Odoo is good option?

我在我的自定义模块中创建了一个新方法,我想在用户点击销售订单中的按钮 confirm 时使用我的方法。所以我做了研究并找到了完成这项工作的简单解决方案。

所以我只是想知道,这是正确的方法吗?还有比这更好的解决方案吗?请给我建议。

覆盖任何方法的最佳方法是使用 super(),以执行旧功能并避免破坏也会覆盖该源方法的其他模块方法的功能。如果你这样做,你就做得很好。但有时你会发现无法使用super()的情况,需要复制源代码修改里面的任何东西。在这些情况下,您必须小心并注意您正在覆盖的内容。

Example A

  • 您有基本方法 action_confirm(),它由 sale 模块创建。
  • 您安装了一个名为 sale_extension 的模块,它使用 super().
  • 覆盖了 action_confirm() 方法
  • 然后你安装你的自定义模块,你也用 super().
  • 覆盖 action_confirm()
  • 当调用 action_confirm() 时,它将执行 salesale_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