【问题标题】:How to override the main create method in odoo11?如何覆盖odoo11中的主要创建方法?
【发布时间】:2020-10-13 20:30:12
【问题描述】:

我有很多模型(大约 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”功能,这样我就不必在每个模型中都编写它了?

【问题讨论】:

  • 你想要所有模型的这种行为还是仅仅这 30 个模型

标签: python overriding odoo odoo-11 redefine


【解决方案1】:

你可以通过 munkey 修补来做到这一点,但我真的不建议这样做,你应该做的是创建一个小模块来执行此操作并确保所有其他模块都依赖它,这样调用检查只会进行一次。

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

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

【讨论】:

  • 我非常同意这一点。特别是已经不建议与 Odoo 的核心混淆。许可方法中的任何错误都将导致不创建对象。最重要的是,它会使 Odoo 显着变慢(第一手经验)。正如@charif 所描述的,只需从中创建一个可重用的模块。
  • 您的回答做出了一些错误的假设。我认为您将“模型”(在问题中)与“模块”(不在问题中)混合在一起。所以问题是:如果我已经有一个核心功能要改变,我怎么能避免对每个模型重复相同的逻辑。所以我看到了两个更好的答案: 1. 我的第一个答案只是扩展 create 与 Odoo 的继承,这可能会导致像 @Ludo21South 提到的问题。作为 2. 回答(我稍后会写)mixin 的使用,这也可能导致此类问题,但不是在 Odoo 中的每个模型上,而是在使用 mixin 的模型上。
【解决方案2】:

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

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']

【讨论】:

  • 我更喜欢第二个选项我们更优雅
  • 虽然我同意这个答案(第二个选项非常优雅),但我仍然想指出这个问题的真正根本问题;许可证检查与 30 个对象的创建选项相关联。以我的拙见,我会首先检查您是否可以将两者分开。也许在登录时或在此过程的早期设置许可选项?我知道这不是 TS 所要求的,如果他真的想实现这种行为,我会推荐 @CZoellner 使用 mixins 的第二个选项。
  • 是的,应该重新考虑整个要求或满足它的概念。
  • 选项 #2 效果很好。感谢大家的快速响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2011-02-24
相关资源
最近更新 更多