何时在odoo | openerp中使用api.one和api.multi?

何时在odoo | openerp中使用api.one和api.multi?,openerp,odoo,openerp-8,Openerp,Odoo,Openerp 8,最近,odoo(前身为OpenERP)V8已经发布。在新的API方法中,引入了修饰符。在models.py中,方法需要用@api.one或@api.multi修饰 我无法确定确切的用途。有人能详细解释一下吗 谢谢。通常这两个解码器都用于装饰记录样式方法,其中“self”包含记录集。让我简要解释一下何时使用@api.one和@api.multi: 1.@api.one: 装饰一个记录样式方法,其中“self”应该是一个单例实例 修饰的方法会自动在记录上循环(即,对于记录集中的每个记录,它调用该方

最近,odoo(前身为OpenERP)V8已经发布。在新的API方法中,引入了修饰符。在
models.py
中,方法需要用
@api.one
@api.multi
修饰

我无法确定确切的用途。有人能详细解释一下吗


谢谢。

通常这两个解码器都用于装饰记录样式方法,其中“
self
”包含记录集。让我简要解释一下何时使用
@api.one
@api.multi

1.
@api.one

  • 装饰一个记录样式方法,其中“self”应该是一个单例实例

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

  • 如果该方法用@returns修饰,它将连接结果实例。这种方法:

    @api.1 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)
# recs = model.browse(cr, uid, ids, context)
recs.method(args)

model.method(cr, uid, ids, args, context=context)
  • 每次“自我”被重新定义为当前记录时
2.
@api.multi

  • 修饰一个记录样式方法,其中“
    self
    ”是一个记录集。该方法通常定义对记录的操作。这种方法:

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

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

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

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

model.method(cr, uid, ids, args, context=context)
何时使用:

  • 如果您使用的是@api.one,则返回值位于列表中。 web客户端并不总是支持这一点,例如按钮操作 方法。 在这种情况下,您应该使用@api.multi来修饰您的方法,并可能在 方法定义

  • 最好将@api.multi与self一起使用。确保_one()而不是@api.one,以避免返回值中的副作用


  • @api.one

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

    @api.one
    def func(self):
        self.name = 'xyz'
    
    @api.multi

    Self将是当前记录集,无需迭代。这是默认行为:

    @api.multi
    def func(self):
        len(self)
    

    有关所有API的详细描述,只要我看到方法装饰器允许指定如何处理内部记录的语义信息,就可以参考此

    。关于“何时使用api.multi”这一点。此标准是否基于webclient支持?在所有情况下,这些问题都无法通过api.return解决?我认为这样我们就牺牲了语义信息,这些信息对ORM进行优化和决定正确的调用非常有用。我认为这就像在ORM不支持某些操作时使用越来越多的SQL语句,而不是改进它。@BomberMan感谢您的详细解释!这解开了我的谜团:)我想知道为什么我收到了我的方法列表:)回答得好!只想补充一点:@api.one由于v9.0()而被弃用。请尽量避免将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。