简介:实际项目开发中经常需要涉及到表与表之间数据的交互关联,Odoo中关联字段就是用来绑定表与表之间数据主从关系的。

Odoo中的关联字段有:

  • Many2one 主表中创建一个字段来存储从表记录的id。这就意味着主表的每条记录只能关联从表中的一条记录。打个比方,银行卡记录表是主表,我们的身份证是从表,每张银行卡只能属于一个人,也就是每张银行卡只能关联一个身份证。
  • One2many 和上边的Many2one是相反的,主表是身份证,从表是银行卡,一个身份证可以拥有多张银行卡。One2many和Many2one一起使用的时候主从表数据可以互通。odoo中创建这个字段的时候,odoo会创建一张视图来处理他们的关系,获取从表中的id和从表中的存储Many2one字段组成的视图。
  • Many2many 和One2many不一样,odoo会生成辅助表来存储主从表id与id之间的关联,辅助表中有两个字段,一个是主表的id,一个是从表的id,所以这里每个主表id可以与多个从表id关联。和Many2one不同的是,Many2many是单项关联从表,所以从表并不知道。如:身份证表中关联了多张银行卡,但银行卡中没有身份证id的字段;这样的话通过身份证可以得到银行卡的信息,但却不能通过银行卡得到身份证的信息。 

1. 关联字段操作格式

many2many

(0,0,{values}) 根据values里面的信息新建一个记录。(values是一个字典,以下同样)

(1,ID,{values})更新id=ID的记录(写入values里面的数据)

(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)

(3,ID) 切断主从数据的链接关系但是不删除这个数据

(4,ID) 为id=ID的数据添加主从链接关系。

(5) 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)

(6,0,[IDs]) 用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))

例子[(6, 0, [1, 2, 3, 4])] 设置 many2many to ids [1, 2, 3, 4]

one2many

(0, 0,{ values })根据values里面的信息新建一个记录。

(1,ID,{values}) 更新id=ID的记录(对id=ID的执行write 写入values里面的数据)

(2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)

(6,0,[IDs]) 用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))(先有数据再和关联字段绑定)

 2.many2many赋值举例

# 定义一个many2many字段
purchase_strategy_ids = fields.Many2many('purchase.strategy.line', column1='purchase_strategy_rel',
                                             column2='purchase_strategy', string='采购报价')
  •  (0,0,{values})        原理:根据values的值新建一条purchase.strategy.line记录,并将记录id与purchase_strategy_ids关联
 for line in rec.purchase_strategy_line:
        self.purchase_strategy_ids = [(0, 0, {'purchaser_id': line.purchaser_id.id,
                                              'large_price': line.large_price,
                                              'little_price': line.little_price,
                                              'history_price': line.history_price})]                                                               
                                              'history_price': line.history_price})]
  •  (4,ID)         原理:purchase.strategy.line表中id=ID的数据与purchase_strategy_ids添加主从链接关系
for line in rec.purchase_strategy_line:
    self.purchase_strategy_ids = [(4, line.id)]
  • (6,0,[IDs])         原理:用IDs里面的id关联的记录替换原来的记录,生成新的主从关联关系
self.purchase_strategy_ids = [(6, 0, [1, 2, 3, 4])]

 3.one2many字段定义及赋值举例

class PurchaseApplication(models.Model):
    _name = 'purchase.application'

    # 定义一个one2many字段,通过order_id字段绑定purchase.strategy.line模型
    purchase_strategy_line = fields.One2many('purchase.strategy.line', 'order_id', string='采购策略')


class PurchaseStrategy(models.Model):
    _name = 'purchase.strategy.line'

    #  order_id字段指向purchase.application模型,进行反向绑定。purchase.application模型和purchase.strategy.line模型形成双向绑定,一个订单对应多个报价,每个报价指向对应订单
    order_id = fields.Many2one('purchase.application', string='申购订单', required=True)
  •   (0,0,{values})        原理:根据values的值新建一条purchase.strategy.line记录,并将记录id与purchase_strategy_line关联
self.purchase_strategy_ids = [(0, 0, {'value'})]

one2many赋值方式类似于many2many赋值方式,相信理解了上面的内容并不难实现。

如何在odoo中自动将一个one2many字段值填充到另一个one2many字段

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐