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 ...
随机推荐
- ArcGIS地图投影与坐标系转换的方法
本文介绍在ArcMap软件中,对矢量图层或栅格图层进行投影(即将地理坐标系转为投影坐标系)的原理与操作方法. 首先,地理坐标系与投影坐标系最简单的区别就是,地理坐标系用经度.纬度作为空间衡量指 ...
- QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库
简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题 ...
- asp.net mvc Core 网页错误提示:An unhandled exception occurred while processing the request.处理请求时发生未处理的异常。
网页错误提示: An unhandled exception occurred while processing the request. InvalidOperationException: The ...
- 记一次Redis Cluster Pipeline导致的死锁问题
作者:vivo 互联网服务器团队- Li Gang 本文介绍了一次排查Dubbo线程池耗尽问题的过程.通过查看Dubbo线程状态.分析Jedis连接池获取连接的源码.排查死锁条件等方面,最终确认是因为 ...
- 源码搭建zabbix平台
1.基于lnmp部署zabbix监控平台; zabbix优点: 1.支持自动发现服务器和网络设备: 2.分布式的监控体系和集中式的WEB管理: 3.支持主动监控和被动监控模式: 4.基于SNMP.IP ...
- 9.24 多校联测 Day4 总结
没有罚坐,但好像什么也没做. 反向挂分,RP++. 开考推 T1 的 k=2.推推推,写写写,假了.又假了.还是假的. 此时已过去 1h,开 T2,没有看懂题,又看了一会依旧没有看懂. 开 T3.尝试 ...
- 用AI打造一个属于自己的歌手,让她C位霸气出道
一.前言 今天玩儿点儿特别的,AI大行其道的今天,还没玩过AI模型的程序员绝对不是个好厨子.我本人比较喜欢音乐,但是一直没有出道,很是遗憾.那么今天,我就使用AI模型亲手打造一个堪比真人的歌手,让 ...
- 字符串匹配|kmp笔记
很久之前学的了. 我很懒,不太喜欢画图. 做个笔记回忆一下: kmp 朴素比对字符串 所谓字符串匹配,是这样一种问题:"字符串 T 是否为字符串 S 的子串?如果是,它出现在 S 的哪些位置 ...
- 机器学习实战1-kNN最近邻算法
目录 机器学习基础 机器学习的关键术语 k-近邻算法(KNN) 准备:使用python导入数据 实施kNN分类算法 示例:使用kNN改进约会网站的配对效果 准备数据:从文本文件中解析数据 分析数据 准 ...
- 记一个 Android 14 适配引发的Android 存储权限问题
一.bug 背景 项目中有下面这样一段代码,在 Android T 版本运行正常,现在适配到 Android U 上之后,运行时 crash 了.... ... values.put(MediaSto ...