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

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

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

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

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

Openerp many2many字段详解 及创建 产品含税 的 报价单 销售订单例子



  •     通常意义上的多对多关系,指的是关系数据库中两个表之间的一种关系, 该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

        比如在常见的订单管理数据库当中“产品”表和“订单”表之间的关系。单个订单中可以包含多个产品。另一方面,一个产品可能出现在多个订单中。因此,对于“订单”表中的每条记录,都可能与“产品”表中的多条记录对应。此外,对于“产品”表中的每条记录,都可以与“订单”表中的多条记录对应。这种关系称为多对多关系,因为对于任何产品,都可以有多个订单,而对于任何订单,都可以包含许多产品。请注意,为了检测到表之间的现有多对多关系,务必考虑关系的双方。[1]
    要表示多对多关系,您必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。因此,第三个表记录关系的每个匹配项或实例。例如,“订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。
    以上来自百度百科 多对多关系

    OPENERP中的多对多关系:
    many2many :
        语法:fields.many2many('other.object.name',
                    'relation object',
                    'actual.object.id',
                    'other.object.id',
                    'Field Name')
    多对多字段涉及3 个表的操作:
        源表:就是声明 many2many字段的表名 称为 actual.object
        目的表:other.object.name
        关联表:'relation object', OPENERP会自动创建

        说明: other.object.name is the other object which belongs to the relation
                由于多对多指的是两个表之间的关系,那么other.object.name 当然就是指目的表的 对象名咯!!!

                relation object is the table that makes the link
                由于多对多关系通常需要第三个表来记录匹配关系,那么relation object指的就是第三个表也叫关联表的表名,不是对象名哦!

                actual.object.id and other.object.id are the fields' names used in the relation table
                actual.object.id 为关联表的 字段名称,对应原表行 ID值, other.object.id为关系表的 字段名称,值对应目的表行 ID 。行ID通常就是 主键ID。 冒似有点难理解!

    例子:
        Sales order line表的 tax_id字段就是一个多对多字段,定义如下:
                'tax_id': fields.many2many('account.tax', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes', readonly=True, states={'draft': [('readonly', False)]}),
              显而易见,
              原表:sale.order.line
              目的表:account.tax
              关联表:sale.order.tax
               
              order_line_id 就是sale.order.line表的一个字段,值 对应 原表的ID值
              tax_id就是 account.tax表的一个字段,值 对应 目的表的ID值
    简单应用:
              创建一个 产品带 税 的 报价单

            saleOrder = {'partner_id': 5,'partner_invoice_id': 5,'partner_shipping_id': 5,'pricelist_id': 1}       
            saleOrderLine = {'order_id': '','price_unit':10.0,'product_id':2,'product_uos_qty':1,
                            'product_uom':1,'product_uom_qty':8,'name':'fengmi',
                            'tax_id':[(6, 0, [7])]    #【7】为tax_id
                            }
            orderID = self.pool.get('sale.order').create(cr, uid, saleOrder)
            orderLineID = saleOrderLine['order_id'] = orderID       
            self.pool.get('sale.order.line').create(cr, uid, saleOrderLine)
            怎么样,很容易吧。。。轻松创建一个带税的报价单。。



  • 先留名 再拜读



  • 赞...... 相当不错...


Log in to reply