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)
怎么样,很容易吧。。。轻松创建一个带税的报价单。。