Python方法没有覆盖

时间:2017-04-13 03:48:57

标签: python inheritance openerp odoo-10

我试图从Odoo覆盖一个python方法,但没有成功。

我正在做的是

from odoo import models, fields, api

class MYBaseModel(models.BaseModel):
    _register = False

    @api.multi
    def unlink(self):
        print "My Method called"
        return super(MYBaseModel, self).unlink()

我想要实现的是当odoo框架执行unlink方法时,应该调用我的方法,

但是现在我的方法没有被调用,我不知道原因。谁能告诉我我做错了什么?

编辑:

我的目标是为所有模型调用取消关联方法。所以在任何模型中记录都被删除,我的方法应该被调用,然后应该调用基本方法。

5 个答案:

答案 0 :(得分:2)

我认为你已经正确地编写了这个函数,但是错过了在你的课程中添加_inherit。 您需要执行此操作,需要在Class MYBaseModel中添加_inherit='object.name'

而不是super(MYBaseModel, self).unlink()调用models.BaseModel.unlink(),但会跳过您模型的所有unlink()扩展。

答案 1 :(得分:2)

试试这个_register_hook方法 有关更多详细信息和示例,请从Addons中检查文件。

./附加元件/ base_action_rule /模型/ base_action_rule.py

答案 2 :(得分:1)

您需要添加_inherit属性,如下所示:

from odoo import models, fields, api


class MYBaseModel(models.BaseModel):
    _register = False
    _inherit = 'my.base.model'

    @api.multi
    def unlink(self):
        print "My Method called"
        return super(MYBaseModel, self).unlink()

修改

import odoo.models.BaseModel as base
class newClass(base):
    def unlink(self):
        # your code
        return super(newClass, self).unlink()

答案 3 :(得分:0)

正如Surajano在答案中所说,

您现在所做的是定义一个新的BaseModel。但就目前而言,没有任何魔法可以使其适用于现有模型。

您有2个选项(至少):

1-通过python继承现有模型 - 用MyBaseModel继承它们:( Surajano建议)

from odoo.addons.your_addon.models import MYBaseModel
class AccountInvoice(MYBaseModel):
    _inherit = 'account.invoice'
    # now, invoices (and only them) will benefit or your override

2-否则,你可以做一个猴子补丁:

odoo.models.BaseModel.unlink = MYBaseModel.unlink
# or even this : odoo.models.BaseModel = MYBaseModel, but i'm not really sure it will work

每个Odoo模型都可以使用它,但这种方法更加“明确”

编辑:我不确定,但您可能需要在修补它之前保留原始取消链接方法的跟踪,并在unlink()覆盖中使用此original_method)< / p>

希望它可以帮到你,

答案 4 :(得分:0)

尝试使用以下代码:

from odoo import models, fields, api

class MYBaseModel(models.Model):
    _register = False
    _inherit = "ir.model"

    @api.multi
    def unlink(self):
        print "My Method called"
        return super(MYBaseModel, self).unlink()