odoo _register_hook和_patch_methods组合使用,实现日志功能,效果和java的切面类似

发布时间 2023-07-29 08:41:33作者: 三鸡

_register_hook方法是在odoo启动,加载模块时调用,可以在调用期间对某个的模型进行功能增强,比如增加日志
下面是一个简单的示例:

class Log(models.Model):
    _name = "cn.com.brandmax.log"
    _description = "日志"

    def _make_read(self):
        def read(self, fields=None, load="_classic_read", **kwargs):
            result = read.origin(self, fields, load, **kwargs)
            return result
        return read

    def _register_hook(self):
        ccb_product = self.env['cn.com.brandmax.product']
        ccb_product._patch_method('read', self._make_read())

代码调用如下,结果显示为:执行的测试方法

    def action_read(self):
        log = self.env['cn.com.brandmax.log']
        log.read()

增加_patch_method没有增加_patch_method的运行轨迹:

点击read进入的是models的read方法

read进入的是下面模型

注意这句代码
result = read.origin(self, fields, load, **kwargs)
重点:orgin将进入绑定之前模型的read方法
之前完原模型的read方法以后,再继续执行增强模型的方法