跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 新手求助
  4. odoo 装饰器的用法

odoo 装饰器的用法

已定时 已固定 已锁定 已移动 Odoo 新手求助
11 帖子 3 发布者 9.0k 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • D 离线
    D 离线
    digitalsatori
    管理员
    发表于 最后由 digitalsatori 编辑
    #2

    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

    【上海先安科技】(tony AT openerp.cn)

    H 1 条回复 最后回复
    1
    • D 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 离线
      H 离线
      hui
      发表于 最后由 编辑
      #3

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

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

      还是我说的都不对?

      1 条回复 最后回复
      0
      • D 离线
        D 离线
        digitalsatori
        管理员
        发表于 最后由 编辑
        #4

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

        希望回答对你有帮助。

        【上海先安科技】(tony AT openerp.cn)

        H 1 条回复 最后回复
        0
        • D digitalsatori

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

          希望回答对你有帮助。

          H 离线
          H 离线
          hui
          发表于 最后由 编辑
          #5

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

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

          非常感谢您的回答。

          D 1 条回复 最后回复
          0
          • H hui

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

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

            非常感谢您的回答。

            D 离线
            D 离线
            digitalsatori
            管理员
            发表于 最后由 卓忆 编辑
            #6

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

            【上海先安科技】(tony AT openerp.cn)

            H 1 条回复 最后回复
            0
            • D digitalsatori

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

              H 离线
              H 离线
              hui
              发表于 最后由 编辑
              #7

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

              1 条回复 最后回复
              0
              • S 离线
                S 离线
                Siyuan
                发表于 最后由 编辑
                #8

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

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

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

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

                H 1 条回复 最后回复
                0
                • S Siyuan

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

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

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

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

                  H 离线
                  H 离线
                  hui
                  发表于 最后由 编辑
                  #9

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

                  S 1 条回复 最后回复
                  0
                  • H hui

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

                    S 离线
                    S 离线
                    Siyuan
                    发表于 最后由 编辑
                    #10

                    @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 条回复 最后回复
                    0
                    • S Siyuan

                      @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 离线
                      H 离线
                      hui
                      发表于 最后由 编辑
                      #11

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

                      1 条回复 最后回复
                      0

                      你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

                      厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

                      有了你的建议,这篇帖子会更精彩哦 💗

                      注册 登录
                      回复
                      • 在新帖中回复
                      登录后回复
                      • 从旧到新
                      • 从新到旧
                      • 最多赞同


                      • 登录

                      • 没有帐号? 注册

                      • 登录或注册以进行搜索。
                      • 第一个帖子
                        最后一个帖子
                      0
                      • 版块
                      • 标签
                      • 热门
                      • 用户
                      • 群组