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

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

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. OpenERP对象定义详解(连载中...)

OpenERP对象定义详解(连载中...)

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
30 帖子 17 发布者 70.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • N 离线
    N 离线
    NewZN
    写于 最后由 编辑
    #19

    谢谢 Joshua的补充!
    > 另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?
    我的理解是store=true可以将每次函数计算的结果存储到数据库中,这样有两个好处,一是便于DBA从数据库查看数据;二是非OpenERP的软件可以直接访问数据库共享数据。另外补充一点,fcnt_inv不限于写入本对象的数据表,更经常的情形是写入别的对象,甚至同时写入多个对象的数据表。

    > <field name="value" eval="'product.pricelist,'+str(list0)"/>
    前文说过,value字段类型为reference,即形如(product.pricelist,1)的值。这一行就是计算value的值,形如(product.pricelist,list0),list0(经导入后其值是数字)是引用的product.pricelist中的一条记录的id,如下。
            <record id="list0" model="product.pricelist">
                <field name="name">Default Purchase Pricelist</field>
                <field name="type">purchase</field>
            </record>
    也就是说,在<field name="value" eval="'product.pricelist,'+str(list0)"/>之前,必须先有上述导入id="list0"的代码行。

    1 条回复 最后回复
    0
    • N 离线
      N 离线
      NewZN
      写于 最后由 编辑
      #20

          每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中。这些预定义方法有:
      [b]基本方法[/b]:create, search, read, browse, write, unlink。
          def create(self, cr, uid, vals, context={})
          def search(self, cr, uid, args, offset=0, limit=2000)
      def read(self, cr, uid, ids, fields=None, context={})
      def browse(self, cr, uid, select, offset=0, limit=2000)
      def write(self, cr, uid, ids, vals, context={})
      def unlink(self, cr, uid, ids)

      [b]缺省值存取方法[/b]:default_get, default_set。
      def default_get(self, cr, uid, fields, form=None, reference=None)
      def default_set(self, cr, uid, field, value, for_user=False)

      [b]特殊字段操作方法[/b]:perm_read, perm_write
      def perm_read(self, cr, uid, ids)
      def perm_write(self, cr, uid, ids, fields)

      [b]字段(fields)和视图(views)操作方法[/b]:fields_get, distinct_field_get, fields_view_get
      def fields_get(self, cr, uid, fields = None, context={})
      def fields_view_get(self, cr, uid, view_id=None, view_type='form',context={})
      def distinct_field_get(self, cr, uid, field, value, args=[], offset=0,limit=2000)

      [b]记录名字存取方法[/b]:name_get, name_search
      def name_get(self, cr, uid, ids, context={})
      def name_search(self, cr, uid, name='', args=[], operator='ilike',context={})

      [b]缺省值存取方法[/b]:default_get, default_set
      def name_get(self, cr, uid, ids, context={})
      def name_search(self, cr, uid, name=, args=[], operator=’ilike’, context={})

      create方法:在数据表中插入一条记录(或曰新建一个对象的resource)。
      格式:def create(self, cr, uid, vals, context={})
      参数说明:
      vals: 待新建记录的字段值,是一个字典,形如: {'name_of_the_field':value, ...}
      context (optional): OpenERP几乎所有的方法都带有参数context,context是一个字典,存放一些上下文值,例如当前用户的信息,包括语言、角色等。context可以塞入任何值,在action定义中,有一个context属性,在界面定义时,可以在该属性中放入任何值,context的最初值通常来自该属性值。
      返回值:新建记录的id。
      举例:id = pooler.get_pool(cr.dbname).get('res.partner.event').create(cr, uid,{'name': 'Email sent through mass mailing','partner_id': partner.id,'description': 'The Description for Partner Event'})

      search方法:查询符合条件的记录。
      格式:def search(self, cr, uid, args, offset=0, limit=2000)
      参数说明:
      args: 包含检索条件的tuples列表,格式为: [('name_of_the_field', 'operator', value), ...]。可用的operators有:
        =, >, <, <=, >=
        in
        like, ilike
        child_of
      更详细说明,参考《OpenERP应用和开发基础》中的“域条件”有关章节。

      · offset (optional): 偏移记录数,表示不返回检索结果的前offset条。
      · limit (optional): 返回结果的最大记录数。
      返回值:符合条件的记录的id list。

      read方法:返回记录的指定字段值列表。
      格式:def read(self, cr, uid, ids, fields=None, context={})
      参数说明:
      · ids: 待读取的记录的id列表,形如[1,3,5,...]
      · fields (optionnal): 待读取的字段值,不指定的话,读取所有字段。
      · context (optional): 参见create方法。
      返回值:返回读取结果的字典列表,形如 [{'name_of_the_field': value, ...}, ...]

      browse方法:浏览对象及其关联对象。从数据库中读取指定的记录,并生成对象返回。和read等方法不同,本方法不是返回简单的记录,而是返回对象。返回的对象可以直接使用"."存取对象的字段和方法,形如"object.name_of_the_field",关联字段(many2one等),也可以通过关联字段直接访问“相邻”对象。例如:
          addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_id)
          nom = addr_obj.name
          compte = addr_obj.partner_id.bank
      这段代码先从对象池中取得对象res.partner.address,调用它的方法browse,取得id=contact_id的对象,然后直接用"."取得"name"字段以及关联对象patner的银行(addr_obj.partner_id.bank)。

      格式:def browse(self, cr, uid, select, offset=0, limit=2000)
      参数说明:
      select: 待返回的对象id,可以是一个id,也可以是一个id 列表。
      · offset (optional): 参见search方法。
      · limit (optional): 参见search方法。
      返回值:返回对象或对象列表。
      注意:本方法只能在Server上使用,由于效率等原因,不支持rpc等远程调用。

      write方法:保存一个或几个记录的一个或几个字段。
      格式:def write(self, cr, uid, ids, vals, context={})
      参数说明:
      · ids: 待修改的记录的id列表。
      · vals: 待保存的字段新值,是一个字典,形如: {'name_of_the_field': value, ...}。
      · context (optional): 参见create方法。
      返回值:如果没有异常,返回True,否则抛出异常。
      举例:self.pool.get('sale.order').write(cr, uid, ids, {'state':'cancel'})

      unlink方法:删除一个或几个记录。
      格式:def unlink(self, cr, uid, ids)
      参数说明:
      · ids: 待删除的记录的id列表。
      返回值:如果没有异常,返回True,否则抛出异常。


      default_get方法:复位一个或多个字段的缺省值。
      格式: def default_get(self, cr, uid, fields, form=None, reference=None)
      参数说明:
      • fields: 希望复位缺省值的字段列表。
      • form (optional): 目前似乎未用(5.06版)。
      • reference (optional): 目前似乎未用(5.06版)。
      返回值: 字段缺省值,是一个字典,形如: {'field_name': value, ... }。
      举例:self.pool.get('hr.analytic.timesheet').default_get(cr, uid, ['product_id','product_uom_id'])

      default_set方法:重置字段的缺省值。
      格式: def default_set(self, cr, uid, field, value, for_user=False)
      参数说明:
      • field: 待修改缺省值的字段。
      • value: 新的缺省值。
      • for_user (optional): 修改是否只对当前用户有效,还是对所有用户有效,缺省值是对所有用户有效。
      返回值: True

      1 条回复 最后回复
      0
      • JoshuaJ 离线
        JoshuaJ 离线
        Joshua 管理员
        写于 最后由 编辑
        #21

        关于field.function我有其他问题,例如
        sale这个模块里面的

        <br />&#039;amount_untaxed&#039;: fields.function(_amount_all, method=True, digits=(16, int(config&#91;&#039;price_accuracy&#039;])), string=&#039;Untaxed Amount&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; store = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;sale.order&#039;: (lambda self, cr, uid, ids, c={}: ids, &#91;&#039;order_line&#039;], 10),<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;sale.order.line&#039;: (_get_order, &#91;&#039;price_unit&#039;, &#039;tax_id&#039;, &#039;discount&#039;, &#039;product_uom_qty&#039;], 10),<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; multi=&#039;sums&#039;),<br />
        


        _get_order

        <br />&nbsp; &nbsp; def _get_order(self, cr, uid, ids, context={}):<br />&nbsp; &nbsp; &nbsp; &nbsp; result = {}<br />&nbsp; &nbsp; &nbsp; &nbsp; for line in self.pool.get(&#039;sale.order.line&#039;).browse(cr, uid, ids, context=context):<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[line.order_id.id] = True<br />&nbsp; &nbsp; &nbsp; &nbsp; return result.keys()<br />
        


        问题来了上面的代码是在sale.order里面的,他是根据sale.order.line的变化。而触发调不调用 _amount_all。但是_get_oeder里面的ids究竟是从何而来呢?是自动对应这个sale.order的sale.order.line吗?这里的_amount_all是任意一个sale.order.line变化就会触发,还是某个sale.order的sale.order.line变化才促发呢?

        【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

        1 条回复 最后回复
        0
        • N 离线
          N 离线
          NewZN
          写于 最后由 编辑
          #22

          > 问题来了上面的代码是在sale.order里面的,他是根据sale.order.line的变化。而触发调不调用 _amount_all。但是_get_oeder里面的ids究竟是从何而来呢?是自动对应这个sale.order的sale.order.line 吗?这里的_amount_all是任意一个sale.order.line变化就会触发,还是某个sale.order的 sale.order.line变化才促发呢?

          这个问题太深入了,俺没深入调查源代码,只是凭经验回答。_get_order里面的ids从界面上来,是界面上当前Order的order.line的ids。因此,当前界面上的sale.order的任意一个 sale.order.line的变化,将会触发_amount_all的调用。

          1 条回复 最后回复
          0
          • wjfonhandW 离线
            wjfonhandW 离线
            wjfonhand
            写于 最后由 编辑
            #23

            sale.order.line有个比较讨厌的地方就是,他有单独的menu。这样用户可能不在订单header界面进去而是直接修改订单行。

            估计这个store参数就是为了解决这个问题的

            GoodERP -- Odoo China fork

            1 条回复 最后回复
            0
            • K 离线
              K 离线
              K_Go
              写于 最后由 编辑
              #24

              写的真好~~

              1 条回复 最后回复
              0
              • C 离线
                C 离线
                codefans
                写于 最后由 编辑
                #25

                原来楼主就是老肖

                1 条回复 最后回复
                0
                • M 离线
                  M 离线
                  mf1389004071
                  写于 最后由 编辑
                  #26

                  mark

                  1 条回复 最后回复
                  0
                  • Z 离线
                    Z 离线
                    zx0800
                    写于 最后由 编辑
                    #27

                    很好,mark

                    1 条回复 最后回复
                    0
                    • H 离线
                      H 离线
                      hzren
                      写于 最后由 编辑
                      #28

                      很好,mark

                      1 条回复 最后回复
                      0
                      • 佳先生佳 离线
                        佳先生佳 离线
                        佳先生
                        写于 最后由 编辑
                        #29

                        请问,text 可以显示长度吗??

                        1 条回复 最后回复
                        0
                        • L 离线
                          L 离线
                          lindyue
                          写于 最后由 编辑
                          #30

                          学习了

                          1 条回复 最后回复
                          0

                          • 登录

                          • 没有帐号? 注册

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