何时在odoo中使用api.one和api.multi OpenERP的?

Bom*_*Man 12 openerp openerp-8 odoo

最近odoo(以前的OpenERP)V8已经发布.在新的API方法中引入了装饰器.在models.py方法中需要用@api.one或装饰@api.multi.

参考odoo文档我无法确定确切的用途.任何人都可以详细解释.

谢谢.

Bom*_*Man 16

通常两个decoarator都用于装饰记录式方法,其中' self'包含记录集.让我简要解释何时使用@api.one@api.multi:

1 @api.one .:

  • 装饰一个记录式的方法,其中' self '应该是一个单例实例.

  • 装饰方法自动循环记录(即,对于记录集中的每个记录,它调用方法),并生成一个包含结果的列表.

  • 如果方法用@returns修饰,它会连接生成的实例.这样的方法:

    @ api.one def方法(self,args):返回self.name

可以在记录和传统样式中调用,例如::

# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)

names = model.method(cr, uid, ids, args, context=context)
Run Code Online (Sandbox Code Playgroud)
  • 每次'self'被重新定义为当前记录.

2 . @api.multi :

  • 装饰一个记录式方法,其中' self'是记录集.该方法通常定义对记录的操作.这样的方法:

    @ api.multi def方法(self,args):

可以在记录和传统样式中调用,例如::

# recs = model.browse(cr, uid, ids, context)
recs.method(args)

model.method(cr, uid, ids, args, context=context)
Run Code Online (Sandbox Code Playgroud)

何时使用:

  1. 如果您使用@ api.one,则返回的值在列表中.Web客户端并不总是支持这一点,例如按钮操作方法.在这种情况下,您应该使用@ api.multi来装饰您的方法,并且可能在方法定义中调用self.ensure_one().

  2. 总是更好地使用@ api.multi和self.ensure_one()而不是@ api.one来避免返回值中的副作用.


bud*_*d-e 5

@api.one

该装饰器会自动为您在 RecordSet 的 Records 上循环。Self 被重新定义为当前记录:

@api.one
def func(self):
    self.name = 'xyz'
Run Code Online (Sandbox Code Playgroud)

@api.multi

Self 将是当前的 RecordSet,无需迭代。这是默认行为:

@api.multi
def func(self):
    len(self)
Run Code Online (Sandbox Code Playgroud)

有关所有 API 的详细说明,您可以参考此链接