[Django]orm中的外键级联删除

这里的系统环境为django1.6   os为win7

今天有个需求说的是添加一个地区表,然后用外键和几个非常重要的实体表来做关联(地区表作为其他表的外键),写完地区的删除操作的时候,测试了下代码,功能正常。可是眼睛移动到控制台输出的时候傻了

connexesql ->DELETE FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s)
connexesql ->DELETE FROM `ad_ad` WHERE `ad_ad`.`area_id` IN (%s, %s, %s)
connexesql ->DELETE FROM `mngm_area` WHERE `id` IN (%s, %s, %s)

我这删除地区的时候竟然把他关联的实体先删除了!!!   这个地区只是个附属属性,删除它的时候竟然把更重要的实体都删除,这可是严重的问题啊。

于是查询了下django orm中models中关于每个field定义的档, https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey 。
然后把字段定义修改成如下:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

当地区area删除的时候把其他表关联到此字段设置为null,这样就只是把area的记录删除了。

django中外键小常识:

* 外键关联的是一个对象,自动生成的外键名称会在关联的对象的名称后面加上个 "_id" 来作为字段名称

* 默认情况下,外键会自动创建索引,会自动做级联删除, 默认的外键是字段是那张 表的主键

models.SET_NULL这里还有其他几个选项:

* SET_NULL 当外键的字段被删除的时候设置为null前提是指定了 null=True

* CASCADE  默认的选项,当外键关联的字段删除的时候,所有其他表级联删除

* SET_DEFAULT 设置一个默认值,当关联的记录删除的时候恢复成默认值

*DO_NOTHING  django不做任何事情,数据库返回什么就报什么

*  SET()? 还可以set一个函数,当关联记录删除的时候触发得到一个值

对于orm或者说框架,总有很多默认设置,当我们开发的时候一定要多测试多查阅文档才能更好的使用,不至于犯下一些惊人的错误。

本文出自 “orangleliu笔记本”博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/40268495

时间: 2024-10-24 18:42:16

[Django]orm中的外键级联删除的相关文章

Oracle外键级联删除和级联更新

1 级联删除 Oracle在外键的删除上有NO ACTION(类似RESTRICT).CASCADE和SET NULL三种行为. 下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键. -- 班级表 CRATE TABLE TB_CLASS ( ID NUMBER NOT NULL, --班级主键 NAME VARCHAR2(50), --班级名称 CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID) ); -- 学生表 CREATE TA

python django中的orm外键级联删除

今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: 在网上查了一下资料,问题主要是django orm的field字段有关: routemgr = models.ForeignKey('Routemgr',default=1,blank=True,null=True,on_delete=models.SET_NULL) 主要意思就是把Routemg

iOS sqlite3外键级联删除问题解决

最近学习使用数据库,以前上学的时候也学过外键和级联删除. NSString *sql=@"CREATE TABLE PlanModel (Id integer,name text,constraint plan_key primary key (Id))"; NSString *sql=@"CREATE TABLE SystemModel (Id integer,planId integer,name text,foreign key (planId) references

[原创]MYSQL中利用外键实现级联删除和更新

MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录:SET NULL则是表示父表

django如何在 search_fields和list_filter 中包含外键字段

django如何在 search_fields和list_filter 中包含外键字段 我们知道在 admin.py 中定义 search_fields 可以控制在后台管理界面中能够搜索的字段. 但是,当 search_fields 包含外键字段时,此时进行搜索会报错: TypeError at /admin/hello/foo/ Related Field has invalid lookup: icontains 解决的办法是修改 search_fields 中的外键字段名称. 将 sear

Django ORM中常用字段和参数

Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. 这里需要知道的是Django中的CharFiel

SQL Server中建立外键的方法

在SQL中建立外键约束,可以级联查询表中的数据,在C#代码生成器中,也能根据外键关系生成相应的外键表数据模型.外键也可防止删除有外键关系的记录,一定程度上保护了数据的安全性. 步骤: 1.要建立外键关系,首先要保证用来建立外键关系的列具有唯一性,即具有 UNIQUE 约束通常是某表的主键作为另外一个表的外键 2.打开数据库表,找到要建立外键的表.并确保其中要建立外键关系的列与主键表中的数据类型完全一致 3.在要建立外键关系的表中,在任意列上右击,选择[关系] 4.在外键关系对话框中,点击左下角的

mysql|中主外键关系(转)

http://my.oschina.net/liting/blog/356150 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就

mysql中主外键关系

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep