繁体   English   中英

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

[英]How to override the main create method in 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. 使用 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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM