DTcloud 装饰器

发布时间 2023-03-22 21:15:37作者: 中亿丰数字科技

什么是装饰器?

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

DTCloud自带的api装饰器主要有:depends,onchange,constrains,one,returns,multi,model,noguess八个装饰器

@api.depends:

这个装饰器主要运用在odoo的字段相关的函数中。在函数中,对该字段值进行处理时,如果计算值依赖于其他相关字段,不论是与该字段隶属同一张表的还是其他表的字段,都会触发所编写的字段函数。
正因为此,可以利用@api.depends 装饰来侦测与字段相关的其他表的字段。如果decorator中依赖的任何字段“被ORM更改或在表单中更改”,都将触发对decorated函数的调用。
简单的说:就是有针对性的调用函数。

@api.onchange

这个装饰器触发decorated函数的时机是:定义的指定字段如果在form窗体出现了变化,就会触发执行。这里要注意的是,这些字段是隶属于同一个模型或同一界面。
综上,虽然 @api.depends 与@api.onchange有诸多相似的地方,但一个重要区别就是 onchange 的侦测字段范围需要在同一个模型或界面上;而depends 可以侦测关联的模型的字段(可以跨不同表)。

@api.constrains

constrains修饰的方法,并在记录集上调用。即写一个函数,去条件判断。如果不满足约束条件,会弹框报警告。

@api.one

这个装饰器自动遍历记录集的记录,self被重新定义为当前记录:

注意:返回值被放进一个列表里,这种做法并不是总被网页客户端支持,例如在按钮动作方法里。在那种情况下,你应该用 @api.multi 来装饰你的方法,并且可能需要在方法定义里调用 self.ensure_one() 。

@api.returns

这个装饰器保证返回值的一致性。 它基于原始返回值返回指定模型的一个记录集:

如果一个旧API方法调用新API方法,它会自动转换为一个id列表。所有装饰器都继承自这个装饰器,以升级或降级返回值。

@api.multi

self为当前记录集,无迭代。 以下是缺省做法:multi则是指self是多个记录的合集。因此,常使用for或self.ensure_one()来遍历self,否则会出现最大递归错误。multi通常用于:在tree视图中点选多条记录,然后执行某个方法,那么那个方法必须用@api.multi修饰,而参数中的self则代表选中的的多条记录。如果仅仅是在form视图下操作,那么self中通常只有当前正在操作的记录。

@api.model

这个装饰器会把旧API对它装饰的方法的调用转换到新API参数。 它让我们可以优雅的迁移旧代码:

@api.noguess

这个装饰器阻止新API装饰器去改变一个方法的输出。