Odoo:如何覆盖原始功能

Posted

技术标签:

【中文标题】Odoo:如何覆盖原始功能【英文标题】:Odoo: How to override original function 【发布时间】:2015-12-27 20:43:15 【问题描述】:

在 Odoo 中,每次打开产品表单时都会计算产品的数量。这发生在模型product.product ==> function _product_available

此函数返回一个名为 res 的字典。

例子:

res = 8: 'qty_available': 5000.0, 'outgoing_qty': 1778.5, 'virtual_available': 3221.5, 'incoming_qty': 0.0

现在我想修改这些值。我已经设法通过直接在原始function _product_available 中编码来做到这一点。

由于这不是执行此操作的正确方法,因此我想在继承模型中执行此操作。我想我需要覆盖function?还是覆盖?不知道叫什么。

我读到的关于这样做的一切对我来说都很模糊。我找不到太多好的信息或例子。我还在为原始函数是用旧样式 (osv) 编写的事实而苦苦挣扎,而我正在使用新样式 (models)。

根据我在互联网上收集的信息,我写了这样的东西(这是行不通的)。

class product_product_inherit(models.Model): 
    _inherit = 'product.product'
    
    #api.v7 because of old style? Also tried .multi and .model...  
    @api.v7
    def _product_available(self, cr, uid, ids, field_names=None, arg=False, context=None):
        #example of modified values. To be made variable after this is working.
        res = 8: 'qty_available': 200.222, 'outgoing_qty': 1778.5, 'virtual_available': 30205.263671875, 'incoming_qty': 0.0
        result = super(C, self)._product_available(res)    
        return result

有谁知道修改原function _product_available返回字典的正确方法吗?

【问题讨论】:

【参考方案1】:

我想你可以试试这个。

class ProductProductInherit(models.Model): 
    _inherit = 'product.product'

    @api.multi
    def _product_available(self, field_names=None, arg=False):
        #example of modified values. To be made variable after this is working.
        res = 8: 'qty_available': 200.222, 'outgoing_qty': 1778.5, 'virtual_available': 30205.263671875, 'incoming_qty': 0.0
        result = super(ProductProductInherit, self)._product_available(res)    
        return result

【讨论】:

现在已经可以使用了。不管怎么说,还是要谢谢你!我将在我的 OP 中发布我是如何做到的。【参考方案2】:

提问者的解决方案(从问题中删除答案数据):

我是如何工作的:

class product_product_inherit(models.Model): 
    _inherit = 'product.product'

    def _product_available(self, cr, uid, ids, field_names=None, arg=False, context=None):
        for product in self.browse(cr, uid, ids, context=context):
            id = product.id
            res = id: 'qty_available': 200.222, 'outgoing_qty': 1778.5, 'virtual_available': 30205.263671875, 'incoming_qty': 0.0
        return res

只是定义了与原始模型完全相同的方法。

【讨论】:

以上是关于Odoo:如何覆盖原始功能的主要内容,如果未能解决你的问题,请参考以下文章

Odoo 模型函数覆盖无效

在 PhotoKit 中,修改 PHAsset 会留下原始的。如何?可覆盖?

基于原始功能依赖或规范覆盖的依赖性保留?

rails:如何覆盖 cocoon gem 辅助方法并调用原始方法

如何让 Proguard 用优化的 jar 覆盖原始 jar?

通过访问原始文件覆盖 rails helpers