什么是不同的黑莓@ api.one,@ api.multi和@ api.model?

9 odoo odoo-8

我很困惑@ api.one,@ api.multi和@ api.model.

在哪种情况下我们以不同的方式使用它们?

And*_*ius 6

api.one仅在一条记录上调用方法时使用.它确保在使用api.one装饰器调用方法时没有多个记录.假设你有记录partner = res.partner(1,).它只有一个记录,并且有方法例如(in res.partner):

@api.one
def get_name(self):
    return self.name #self here means one record
Run Code Online (Sandbox Code Playgroud)

这样称呼它:

partners = res.partner(1, 2,)

但是如果会有更多的记录,比如 api.multi

调用它,会引发警告,告诉你只能在一条记录上调用它.对于多个记录self的使用,api.model记录集在哪里,它可以通过所有记录迭代来做某事.例如:

partner.get_name()
Run Code Online (Sandbox Code Playgroud)

并且model当您需要对模型本身执行某些操作并且不需要修改/检查某些确切模型的记录/记录时,可以使用它.例如,可能有方法返回一些关于模型结构或一些辅助方法等的元信息.另外在文档中,据说这个api在从旧api迁移时很好用,因为它"礼貌地"将代码转换为新的api .另外根据我自己的经验,如果你需要方法来返回一些东西,api.one装饰者也是有益的.api.one返回空列表,因此当使用api.oneon方法返回某些内容时,它可能会导致意外行为.

更多信息:http://odoo-new-api-guide-line.readthedocs.org/en/latest/decorator.html

  • 不,这是完全错误的...您可以在包含多个记录的记录集上调用 api.one 方法,它只会在记录集上循环,为每个记录重新定义 self 。看其他答案... (2认同)
  • 此外,它不返回空列表,它返回每个操作的返回值的列表(如果它需要一个 dict,它可能不适用于 gui 调用) (2认同)