Odoo提供了几种方式来处理级联操作:
级联创建 (创建时自动创建关联记录)
创建记录时,可以在字段中嵌套字典或元组来同时创建关联的记录。
order = env['sale.order'].create({
'partner_id': partner_id,
'order_line': [
(0, 0, {'product_id': product1_id, 'product_uom_qty': 10}),
(0, 0, {'product_id': product2_id, 'product_uom_qty': 20}),
],
})
在上面的例子中,创建销售订单时同时创建了两个销售订单行。
级联更新 (更新时自动更新关联记录)
更新记录时,也可以同时更新关联记录。
order.write({
'order_line': [
(1, order_line_id, {'product_uom_qty': 15}), # 更新现有的订单行
(0, 0, {'product_id': product3_id, 'product_uom_qty': 5}), # 添加新的订单行
],
})
在此例中,我们更新了一个现有的订单行,并添加了一个新的订单行。
级联删除 (删除时自动删除关联记录)
当你删除一个记录时,你可以设置Odoo在删除该记录的同时也删除所有相关联的记录。
order.unlink() # 如果在One2many字段中设置了ondelete='cascade',这将同时删除所有相关的订单行
在上面的例子中,删除销售订单将导致所有关联的销售订单行也被删除,前提是sale.order.line模型中order_id字段的ondelete属性被设置为'cascade'。
三、数据库的操作
在底层数据库中,Odoo使用SQL约束来管理这些级联操作。
ondelete='cascade': 在数据库层面,如果设置了这个选项,删除父记录会导致所有子记录被删除。
ondelete='set null': 删除父记录后,子记录中的关联字段会被设置为NULL。
ondelete='restrict': 如果还有子记录存在,阻止删除父记录。
请注意,数据库的操作比ORM层面的级联操作有更高的优先级,因为它们是数据库级别的约束。
通过这些级联操作,Odoo可以保证数据的完整性和关联性,让开发者能够写出更干净、更有效的代码,同时帮助系统避免出现悬挂的引用和孤立的数据记录。