如何覆盖odoo11中的主创建方法



我有很多模型(大约30个(覆盖创建方法来检查许可证状态,它们都是这样的:

class Model1(models.Model):
_name='testing_model1'
@api.model
def create(self)
check_license(self)
return super(Model1, self).create(values)

有没有办法把";check_license";函数,这样我就不必在每个模型中都写它了?

您可以通过munkey修补来做到这一点,但我真的不建议这样做,您应该做的是创建一个小模块来完成这一任务,并确保所有其他模块都依赖于它,这样只会调用一次检查。

当你在两个模块中重复一个代码时,请考虑将其提取到一个小模块中,并确保这两个模块依赖于它

就像在您的情况下一样,您可以创建模块check_license,将此操作的所有相关代码放入其中,修复对其他30个模块的依赖性,这将确保当您安装其中一个模块时,将首先安装新模块,并且主要的好处是,即使您安装了所有30个模块,检查许可证的调用也只会发生一次

我看到了两种简单的可能性:

1.Odoo继承的使用

Odoo的继承机制也在基础模型上发挥作用。以下示例来自Odoo V13模块base_import,但在Odoo V11中也有一些示例(例如在web中(:

class Base(models.AbstractModel):
_inherit = 'base'
@api.model
def get_import_templates(self):
"""
Get the import templates label and path.
:return: a list(dict) containing label and template path
like ``[{'label': 'foo', 'template': 'path'}]``
"""
return []

以下是您需要的代码(由于create已更改,在以后的版本中不起作用(:

class Base(models.AbstractModel):
_inherit = 'base'
def create(self, values):
"""
Extended core method to implement a license check,
before creating a record.
"""
check_license(self)
return super().create(values)

2.使用mixin(Odoo代码中有很多例子(

可以使用mixin类将许可证检查限制在某些模型上,这些模型将继承此mixin。1。概念并没有限制它(但也有可能(。

class LicenseCheckMixin(models.AbstractModel):
_name = 'license.check.mixin'
def create(self, values):
"""
Extended create method to implement a license check,
before creating a record.
"""
check_license(self)
return super().create(values)

然后,您可以在其他Odoo模型中继承此mixin:

class SaleOrder(models.Model):
_name = 'sale.order'
_inherit = ['sale.order', 'license.check.mixin']

相关内容

  • 没有找到相关文章

最新更新