Navigation

    Odoo 中文社区

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • Popular
    • Users
    • Groups

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

    odoo 装饰器的用法

    Odoo 新手求助
    3
    11
    5440
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      hui last edited by

      新人求助问题:
      1、odoo装饰器@api.multi,@api.model,@api.one用法及区别?

      1 Reply Last reply Reply Quote 0
      • digitalsatori
        digitalsatori 管理员 last edited by digitalsatori

        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

        H 1 Reply Last reply Reply Quote 1
        • H
          hui @digitalsatori last edited by

          @digitalsatori
          api.model这个装饰器是针对传进去的参数self是一个model, 还是说返回值是一个model

          api.multi这个装饰器是针对传进去的参数self是一个RecordSet, 还是说返回值是一个RecordSet

          还是我说的都不对?

          1 Reply Last reply Reply Quote 0
          • digitalsatori
            digitalsatori 管理员 last edited by

            self都是recordSet, 返回值是不定的,根据应用场景的。关键是函数实际处理的对象。
            api.model是不对记录处理的,比如create方法用的就是api.model,因为在调用create方法时根本没有记录, 而write方法就要用api.multi,因为写入是要针对记录来得。

            希望回答对你有帮助。

            H 1 Reply Last reply Reply Quote 0
            • H
              hui @digitalsatori last edited by

              @digitalsatori
              按您说的,我的理解是:
              1、函数中的默认必传参数self都是recordset(集合的理解),即使只有一条数据,也是长度为1的recordset。
              2、装饰器的使用不是针对参数,也不是针对函数返回结果,相当于是对记录处理结果的预估。有需要处理recordset的用api.multi,不处理recordset的用api.model?这样的话,全都用api.multi不可以吗?或者对业务很熟悉,就能分清什么时候用哪个了。不知道这个理解有问题吗?

              再者,上面您说的api.one,已经不用了,但是看到有些代码中,把api.one跟api.depends联合使用的,这样使用的用意是什么?

              非常感谢您的回答。

              digitalsatori 1 Reply Last reply Reply Quote 0
              • digitalsatori
                digitalsatori 管理员 @hui last edited by 卓忆

                @1234567 recordSet有可能是空集,即长度为0。由于系统实现的细节以及向后兼容,api.multi和api.model是不能混用的。
                api.one已经deprecated,并不意味着不在代码中出现了,只是表示未来可能没法用了。
                api.depends又是另外的故事了,请还是多看官方文档。

                H 1 Reply Last reply Reply Quote 0
                • H
                  hui @digitalsatori last edited by

                  @digitalsatori
                  装饰器的使用是根据场景的,有哪些场景,看了官方文档了,还是不知道什么时候使用装饰器,使用哪个?

                  1 Reply Last reply Reply Quote 0
                  • S
                    Siyuan last edited by

                    常用的增删查改,default, compute, onchange, 按钮按下的action 等可以直接参考官方代码的装饰器,

                    如果是模型内部的方法,不是对外的接口,基本上不用装饰器也可以(在最先被调用的地方基本上已经用装饰器装饰过了),

                    如果是对外的接口,调用的时候能有记录id的用multi (model很少用),

                    真要写个通用的方法,不走odoo的框架都可以,自己控制传入的参数。

                    H 1 Reply Last reply Reply Quote 0
                    • H
                      hui @Siyuan last edited by

                      @Siyuan
                      你说的自己能写个通用的方法,不走odoo框架可以。你给写个例子参考下吧。:sisi:

                      S 1 Reply Last reply Reply Quote 0
                      • S
                        Siyuan @hui last edited by

                        @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 无关了。

                        H 1 Reply Last reply Reply Quote 0
                        • H
                          hui @Siyuan last edited by

                          @Siyuan
                          嗯,谢谢,我好好看看,区分下odoo和python。

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post