如何重写odoo11中的主要创建方法?

问题描述

我有很多模型(大约30种)可以覆盖create方法来检查许可证状态,所有模型都像这样:

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。使用混合(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']

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...