Odoo16—级联删除
我们在odoo中构建业务系统模块的时候,通常会使用one2many、many2one或many2many将模型进行关联,由此产生的数据也会通过外键发生关联。那么在odoo中删除数据的时候,如何关联删除呢?接下来我们以初学者的视角来观察下这一过程。
刚开始接触odoo,可能时不时的就会感叹odoo的低代码魅力:“这么少的代码,这么强悍的功能”。即便是一个主从模型的功能,很快也就完事了。正沉浸在这种喜悦中的时候,突然一个弹框提示:

目前构建的代码涉及到两个菜单功能,运单管理和承运管理,业务场景是这样的:
- 运单管理用于创建要运送的货物的基本信息和明细信息,包括主表[waybill]和明细表[waybill_detail]
- 承运管理也是一个主附表关系,主表[shipping_document]用来记录车辆、司机、运费等基本信息,附表[shiping_document_detail]用来记录要承运的运单信息
- 现在要删除运单表的信息,但是提示需要把承运明细表[shiping_document_detail]中的数据删除;问题是承运管理中的数据已经删除过了,用动态图来说明下:

既然提示说需要删除承运明细表[shiping_document_detail]中的数据,在管理界面中已经删除过看不到数据了,我们不妨到数据表中看下:

原来在数据库中并没有把数据删除掉,只是把承运主表[shipping_document]的关联id删除了,如上图标记1所示。如果此时我删除运单表[waybill]中的数据,在承运明细表[shipping_document_detail]中依然有和运单相关的残留数据,如上图标记2所示。这在odoo看来是不可接受的,所以就抛出了验证错误提示。要避免这样的验证错误提示发生,我们就需要在删除承运主表[shipping_document]数据的时候,将承运明细表[shipping_document_detail]中的关联数据也删除掉。接下来我们就来说下odoo中的级联删除操作:
ondelete=’cascade’
ondelete是odoo在模型中引入的一种触发机制,在odoo16源码中,目前只有Selection和Many2one这两种字段类型支持传参调用,我们看下ondelete在Many2one类型中的定义:

通过上图我们了解到,ondelete的功能就是在参考模型中的记录被删除的时候,做一些操作。可以有’set null’、’restrict’、’cascade’这些操作,现在我们主要介绍cascade。我们在承运明细表[shipping_document_detail]的关联字段shipping_document_id上添加ondelete=’cascade’:
1 class ShippingDocumentDetail(models.Model):
2 _name = 'shipping.document.detail'
3 _description = 'Shipping Document Detail'
4
5 waybill_id = fields.Many2one('waybill', required=True, domain="[('destination', '=', destination_id)]")
6 receiver_id = fields.Many2one(related='waybill_id.receiver_id', readonly=True)
7 receiver_tel = fields.Char(string="Consignee Phone", store=False, readonly=True, compute="_compute_customerInfo")
8 detail_ids = fields.One2many(related='waybill_id.detail_ids')
9 total_fees = fields.Float(related='waybill_id.total_fees')
10 shipping_document_id = fields.Many2one('shipping.document', string='Shipping Document',ondelete='cascade')
11 destination_id=fields.Integer(string='Destination Id', compute="_compute_destination_id")
模块升级后,我们先手动删除承运明细表[shipping_document_detail]中的残留数据,然后添加新的测试数据,我们添加的承运单截图如下:

数据库中对应截图如下:

接下来我们执行承运单的删除操作,再查询数据库的时候,发现刚才创建的数据已经没有了。

写这篇博客的时候,我已经整理好了文章大纲,边写边测试验证,最后发现我原来的理解是错的,原来的大纲中还有在One2many中使用ondelete=’cascade’,以及ondelete=’cascade’无法解决问题时如何通过unlink()来解决。唉,半路借来的内容真是害人不轻。还好写了博客,又参考odoo官方文档和源码走了一遍流程;不仅深入的理解了这个知识点,也优化了一知半解的时候写的代码。
源码地址【源码更新会有3-5天的时间出入】:github
点击链接阅读原文:菜园工程师
Odoo16—级联删除的更多相关文章
- [原创]MYSQL中利用外键实现级联删除和更新
MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...
- EF里一对一、一对多、多对多关系的配置和级联删除
本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...
- EF级联删除
引言 在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图 ...
- [NHibernate]一对多关系(级联删除,级联添加)
目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...
- SQLServer表内自关联级联删除
今天处理SQLServer级联删除遇到了很蛋疼的事. SQLServer 不支持表内自关联级联删除,而MySql和Oracle却支持. 貌似原因是SQLServer 会产生循环级联,就不给这样弄.所以 ...
- Entity framework 级联删除注意事项
版本:EF6.0.1 RC 一对多场景,在子对象映射中开启级联删除情况下,删除父对象将自动删除其下所有子对象,需要注意一些事项: 需要保证DbContext中已经加载了该父对象的所有子对象. 如果Db ...
- Oracle 级联删除
alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...
- MySQL级联删除的问题
一.FOREIGN KEY 的定义分为两种:列级约束和表级约束 .列及约束的话,可以在列定义的同时,定义外键约束.比如 如果有2张表,主表:T1(A1 )) 要在从表T2中定义外键列这可以: Crea ...
- EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除
外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...
- SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
create table a(id varchar(20) primary key,password varchar(20) not null) create table b(id int iden ...
随机推荐
- Django——后台添加的用户密码错误
django项目中,当我们创建了user模型类,并生成了超级管理员,之后我们进入到admin后台页面中,添加一个用户,再去login页面登陆时,会提示我们 用户名或密码错误. 这时,我们第一时间会想到 ...
- FFT & NTT 及其简单优化
FFT FFT 是一种高效实现 DFT 和 IDFT 的方式,可以在 \(O(n \log n)\) 的时间内求多项式的乘法. 多项式的点值表示 不同于用每项的系数来表示一个多项式,我们知道对于给定的 ...
- P8816 [CSP-J 2022] 上升点列
Problem 考察算法:\(DP\). 题目简述 给你 \(n\) 个点,每个点有一个坐标 \((x_i,y_i)\),还可以添加 \(k\) 个点. 添加之后,求:最长的上升点列的长度. 上升点列 ...
- BFF层提升业务性能实际解决方案,以及nodeJs和KOA框架介绍
本文干货满满,介绍了用BFF层(Back-end For Front-end)中间层提升性能的整体解决方案和思路,涉及前期技术调研,聚合业务分析,聚合方法,验收,最后向同学们普及node.koa基础知 ...
- webpack配置打包
一.webpack基本安装 1.创建webpack项目目录如webpackDemo,并进入webpackDemo; 2. 在node已经安装的前提下,打开命令行控制器,输入如下命令: npm init ...
- JVM-内部类分析
一.内部类和外部类调用及字节码解释 外部类使用 内部类: 非静态内部类: JVM字节码 非静态内部类类 多了一个外部类对象的属性:final synthetic Field this$0:" ...
- JUC并发编程学习笔记(十二)Stream流式计算
Stream流式计算 什么是Stream流式计算 大数据:存储+计算 集合.MySql这些的本质都是存储东西的: 计算都应该交给流来操作! 一个案例说明:函数式接口.lambda表达式.链式编程.St ...
- Hugging Face 在法国联合启动人工智能创业项目!
Hugging Face.Meta.Scaleway 与法国创业孵化基地 STATION F 合作的人工智能创业项目正式启动 申请截止日期为 12 月 1 日本项目旨在利用开源人工智能的力量来扶持初创 ...
- 将强化学习引入NLP:原理、技术和代码实现
本文深入探讨了强化学习在自然语言处理(NLP)中的应用,涵盖了强化学习的基础概念.与NLP的结合方式.技术细节以及实际的应用案例.通过详细的解释和Python.PyTorch的实现代码,读者将了解如何 ...
- springboot在线人数统计
在线人数统计 笔者做了一个网站,需要统计在线人数. 在线有两种: 一.如果是后台系统如果登录算在线,退出的时候或者cookie.token失效的时候就算下线 二.如果是网站前台,访问的时候就算在线 今 ...