- 记录集方法:@api.multi
大多数情况下,我们需要一个自定义方法来对记录集执行一些操作。此时就需要使用@api.multi,并且此处self参数就是要操作的记录集。方法的逻辑通常会包含对 self 的遍历。@api.multi是最常用的装饰器。
小贴士:如果模型方法没有添加装饰器,默认就使用@api.multi。
- 单例记录方法:@api.one
有些情况下方法用于操作单条记录(单例),此时可使用@api.one装饰器。现在仍可使用@api.one,但在 Odoo 9中已声明为弃用。它包裹装饰的方法,进行 for 循环遍历,它调用装饰方法,一次一条记录,然后返回一个结果列表。因此在@api.one装饰的方法内,self 一定是单例。
小贴士:@api.one的返回值有些搞怪,它返回一个列表,而不实际方法返回的数据结构。比如方法代码如果返回字典,实际返回值是一个字典值列表。这种误导性也是该方法被弃用的主要原因。
对于要操作单条记录的方法,我们应还是使用@api.multi,在代码顶部添加一行self.ensure_one(),来确保操作的是单条记录。
- 类静态方法:@api.model
有时方法需要在类级别而不是具体记录上操作。面向对象编程语言中,这称之为静态方法。这些类级别的静态方法应由@api.model装饰。在这些情况下,self 应作为模型的引用 ,无需包含实际记录
@api.model装饰的方法无法用于用户界面按钮,在这种情况下,应使用@api.multi。
- @api.onchange 方法
onchange由用户界面表单视图触发,当用户编辑指定字段值时,立即执行一段业务逻辑。这可用于执行验证,向用户显示消息或修改表单中的其它字段。支持该逻辑的方法就使用@api.onchange(‘fld1’, ‘fld2’, …)装饰。装饰器的参数是用户界面通过编辑需触发方法的字段名。
小贴士:通过为字段添加属性on_change=”0″可在特定表单中关闭 on change 行为,比如<field name=”fld1″ on_change=”0″ />
- 其它模型方法装饰器
以下装饰器也会经常使用到,它们与模型内部行为有关
1.@api.depends(fld1,…)用于计算字段函数,来识别(重新)计算应触发什么样的修改。必须设置在计算字段值上,否则会报错。
2.@api.constrains(fld1,…)用于模型验证函数并在任意参数中包含的字段修改时执行检查。它不应向数据库写入修改,如检查失败,则抛出异常。
网友评论