Odoo中@api.multi、@api.mode、@api.one等修饰器

本文介绍了Odoo中的方法修饰器。包括@api.multi对每条记录执行方法且有返回值;@api.one在9.0版本被弃用,无返回值;@api.model是类级静态方法修饰,用于定时任务,有返回值但无ids传入。还提及其他修饰器用途,最后总结了各修饰器的返回值和ids传入情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法修饰器

在我们学习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传入。其他的修饰器,没有什么特别的,用到的时候查一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值