odoo 装饰器的用法
-
api.one
在V9.0以后就已经废弃了,不用纠结api.model
表示其所装饰的方法操作于RecordSet所对应的model
而非其内容
比如:@api.model def method(self, args)
用新API调用:
recs.method(args)
用旧API调用:recs.method(cr, uid, args, context=context)
(注意:与下面api.multi
相比,旧API中没有ids
)api.multi
表示其装饰的方法操作于对应RecordSet的内容即其所对应的记录上
比如:@api.multi def method(self, args)
用新API调用:
recs.method(args)
用旧API调用:recs.method(cr, uid, ids, args, context=context)
(注意:与上面api.model
相比,旧API中有ids
)如果这么说还是看不明白,建议学习官方文档:http://www.odoo.com/documentation/10.0/reference/orm.html
-
@digitalsatori
api.model
这个装饰器是针对传进去的参数self是一个model, 还是说返回值是一个modelapi.multi
这个装饰器是针对传进去的参数self是一个RecordSet, 还是说返回值是一个RecordSet还是我说的都不对?
-
self
都是recordSet, 返回值是不定的,根据应用场景的。关键是函数实际处理的对象。
api.model
是不对记录处理的,比如create
方法用的就是api.model
,因为在调用create
方法时根本没有记录, 而write
方法就要用api.multi
,因为写入是要针对记录来得。希望回答对你有帮助。
-
@digitalsatori
按您说的,我的理解是:
1、函数中的默认必传参数self
都是recordset(集合的理解),即使只有一条数据,也是长度为1的recordset。
2、装饰器的使用不是针对参数,也不是针对函数返回结果,相当于是对记录处理结果的预估。有需要处理recordset的用api.multi
,不处理recordset的用api.model
?这样的话,全都用api.multi
不可以吗?或者对业务很熟悉,就能分清什么时候用哪个了。不知道这个理解有问题吗?再者,上面您说的
api.one
,已经不用了,但是看到有些代码中,把api.one
跟api.depends
联合使用的,这样使用的用意是什么?非常感谢您的回答。
-
@digitalsatori
装饰器的使用是根据场景的,有哪些场景,看了官方文档了,还是不知道什么时候使用装饰器,使用哪个? -
@1234567
例子很多啊,例如官方的:odoo/odoo/tools/sql.py 里面的:
def drop_view_if_exists(cr, viewname):
odoo/addons/account/report/account_invoice_report.py
先:import
from odoo import tools
调用的时候传入对应参数:tools.drop_view_if_exists(self.env.cr, self._table)
这些都是python的语法,已经和odoo 无关了。