首页 > 其他分享 >DTcloud 装饰器

DTcloud 装饰器

时间:2023-03-22 17:37:22浏览次数:29  
标签:API multi DTcloud 函数 self api 装饰

什么是装饰器?

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装饰器去改变一个方法的输出。

标签:API,multi,DTcloud,函数,self,api,装饰
From: https://www.cnblogs.com/DTCLOUD/p/17244825.html

相关文章

  • 装饰器
    importtimedeftime_cal(func):  defimprove_fun():    start_time=5       func()    end_time= 10    print(f'endt......
  • Python装饰器【杭州多测师_王sir】
    defmy_decorator(param):defdecorator(func):defwrapper(*args,**kwargs):print(f"param:{param}")returnfunc(*args,**......
  • 结构型-装饰器模式
    定义  如果希望动态给某个类添加一些属性或者方法,但是你又不希望这个类派生的对象受到影响,那么装饰器模式就可以给你带来这样的体验。它的定义就是在不改变原对象的......
  • Python装饰器深入理解
    在本博客的前面部分其实已经介绍过Python中装饰器的基本使用了(Python迭代器、生成器、装饰器的使用,Python@函数装饰器以及super()父类继承 ),不过还有一些深入的知识点(......
  • 设计模式之装饰者模式,奶茶店场景
    //Seehttps://aka.ms/new-console-templateformoreinformationusingSystem.Drawing;/*装饰者模式,不改变实现类的情况下,动态给实现类增加新功能,这里使用聚合......
  • flask-快捷路由装饰器
    快捷路由装饰器等价于app.get('/login')app.route('/login',methods=['GET'])app.post('/login')app.route('/login'),methods=['POST'app.put('/login')......
  • 装饰器
    引用:1.不是在函数中使用,可以通过sys.getrefcount(a)引用个数2.函数的引用:必须要分清楚传递的值是可变类型还是不可变类型如果全局变量于局部变量:#deftest(n1......
  • js装饰器作用
    JavaScript装饰器(Decorator)是一种语法特性,可以用于修改类和类的属性或方法。它是ES2017引入的新特性,在Vue3和Angular等现代框架中广泛使用。装饰器可以让我们在不......
  • [设计模式]设计模式之装饰器模式/包装模式【8】【待完善】
    1概述当你在编写代码时,需要扩展一个类的功能,或者是当前类的接口不能满足需求时,你会选择怎么做?重新编写子类,通过继承加入功能?修改原有类的接口使其符合现有环境?但你......
  • 装饰器
    #开放封闭原则:对修改封闭,对扩展开放装饰器的核心思想:在不改变被装饰对象的内部代码和原有调用方式的基础上在添加额外的功能装饰器他人的器具,本身可以是任意可调用对象,......