如何覆盖odoo11中的主要创建方法?
How to override the main create method in 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 patching 来做到这一点,但我真的不建议这样做,你应该做的是创建一个小模块来做这个,并确保所有其他模块都依赖于它,这样调用检查只会进行一次。
和平建议,当你在两个模块中重复一个代码时,考虑将它提取到一个小模块中,并确保两个模块都依赖它。
就像您的情况一样,您可以创建模块 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 class 将许可证检查限制为某些模型,这些模型将继承此 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']
我有很多模型(大约 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 patching 来做到这一点,但我真的不建议这样做,你应该做的是创建一个小模块来做这个,并确保所有其他模块都依赖于它,这样调用检查只会进行一次。
和平建议,当你在两个模块中重复一个代码时,考虑将它提取到一个小模块中,并确保两个模块都依赖它。
就像您的情况一样,您可以创建模块 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 class 将许可证检查限制为某些模型,这些模型将继承此 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']