方法修饰器
在我们学习odoo时遇到过很多方法修饰器,通常在.py文件中python类中。那么方法修饰器是干嘛用的呢。这里先说明一下有人叫方法装饰有人叫方法修饰,这是英文翻译的问题。
@api.multi
multi装饰器的作用是对每一条记录都执行对应的方法,相当于traditional-style中的function,与one装饰类不同的是他有返回值!这里self是一个记录
集, 方法通常使用一个for循环来迭代它。
@api.multi
def do(self,a_value):
......
return value
等同于
old_style_model.do(cr, uid, ids, a_avlue,context=context)
......
return some_value
@api.one
在某些情况下,方法会只需要一个单例:一个包含不超过一个记录的记录集。 @api.one 修饰符,在9.0版本被弃用,应该避免使用它。相反,我们仍然应该使用@api.multi添加到方法代码中,与self.ensure_one()保持一致,以确保它是一个单例。虽然 @api.one 修饰符被弃用,但仍然被支持。为了完整起见,可能需要知道它封装了其修饰的方法, 并一次为它提供一个记录,执行记录集迭代。在我们的方法中, self保证是一个单元素。每个方法调用的返回值被聚合为一个列表并返回。
odoo新API中定义方式:
date=fields.Date(string="date",compute="_get_date")
@api.one
def _get_date(self):
self.date=fields.Date.today()
等同于旧API的function 类型的简化版,但是需要特别注意到是one装饰类无返回值。
@api.model
类级别的静态方法使用@api.model修饰,它不使用任何记录集数据。 为了保持一致性,
self仍然是一个记录集,但是它的内容是无关的。注意,这种方法不能被用户界面的按钮
所使用。
一般用于定时任务。
@api.model
def action_done(self):
.......
.......
类似于旧API:
def action_done(self,cr,uid,context=None):
pass
通过实例,可以看出model装饰类,是没有ids传入的,但是他可以有返回值。
其他一些修饰
另外有一些目的更明确的修饰符, 可与前面描述的修饰符一起使用:
@api.depends(fldl,…) 用于计算字段函数,以确定哪些(字段值)更改应该触
发(重新)计算。
@api.constrains(fldl,…) 用于验证函数,以确定哪些更改应该触发验证检查。 @api.onchange(fldl,…) 用于on change函数,以标识表单上将触发该操作的
字段。
特别是, onchange方法可以向用户界面发送警告消息。例如, 这可以警告用户, 刚刚输入的产品数量在库存中是不可用的, 但不会阻止用户继续使用,方法通过返回描述警告消息的字典来实现:
return {
'warning': ( 'title':
'Warning!',
'message': 'You have been warned'
}
总结:
model与multi可以有返回值,而one是没有返回值的,如果用one装饰器,即使写了return,也是没有作用的,虽然不会报错。另外,还有一点区别的是multi与one装饰类是有ids传入的,而model没有ids传入。其他的修饰器,没有什么特别的,用到的时候查一下。