首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django模型外键on_delete=null,但无论如何都会删除外键

在Django中,当我们定义模型之间的关系时,可以使用外键字段来建立关联。默认情况下,当外键所指向的对象被删除时,Django会自动删除包含该外键的对象。然而,有时我们希望即使外键所指向的对象被删除,也不会删除包含该外键的对象。这时可以使用on_delete=null参数来实现。

on_delete=null参数告诉Django在外键所指向的对象被删除时,将外键字段设置为null值,而不是删除包含该外键的对象。这样做的好处是可以保留包含外键的对象,避免数据丢失。

使用on_delete=null参数的场景包括:

  1. 父子关系:当一个父对象被删除时,子对象仍然需要保留,只是将外键字段设置为null值。
  2. 可选关系:当外键关系是可选的,即外键字段可以为空时,使用on_delete=null可以确保即使外键所指向的对象被删除,也不会影响包含该外键的对象。

推荐的腾讯云相关产品是云数据库MySQL版,它是腾讯云提供的一种高性能、可扩展的关系型数据库服务。云数据库MySQL版支持Django框架,并提供了丰富的功能和工具来管理和优化数据库。您可以通过以下链接了解更多关于腾讯云数据库MySQL版的信息:

腾讯云数据库MySQL版

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django 引用自身和on_delete参数

模型使用引用自己本身。...如果对应的那条数据被删除了,那么这条数据也会被删除。 PROTECT:受保护。即只要这条数据引用了的那条数据,那么就不能删除外的那条数据。如果我们强行删除,Django就会报错。...、update的时候,子表会将关联记录的字段所在列设为null,所以注意在设计子表时不能设为not null; 为什么在django中可以是用不同的约束去操作数据库呢。...比如 djangoon_delete=CASCADE, 但是数据库的约束是RESTRICT....在进行删除A表数据时,发现被约束着,使数据不能被删除,则django会先去删除约束的B表数据,然后再来删除A表数据。

1.3K20

Django分组聚合查询实例分享

....publish=publish|publish_id=publish.id) : 默认存在级联删除 改: book修改一定存在 多对多: 关系表的获取(book(主键) and author...ForeignKey(): 字段 to= 关联模型类 (一对多) to_file = 关联字段,省略默认关联主键 on_delete (关联数据被删除时的操作) models.CASCADE...自定义反向查询的字段名 db_constraint=False, 取消关联,还可以使用链表查询 总结: models.ForeignKey(to=’related class name’, null...OneToOneField(): 一对一字段 同 3, ManyToManyField() :多对多关系 to = 关联模型类 through=关联关系类 through_fields关联关系表中...=True, on_delete=models.SET_NULL, db_constraint=False) author = models.ForeignKey(to=’Author’, null=

1.8K10

django_mysql_配置

在自己数据中创建一个djangi_demo create database django_demo default charset=utf8; ---- 定义模型类 1....='图书') # is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta:...2) django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。...null是数据库范畴的概念,blank是表单验证范畴的 5) 一般我用CASCADE 在设置时,需要通过on_delete选项指明主表删除数据时,对于引用表数据如何处理,在django.db.models...中包含了可选常量: CASCADE 级联,删除主表数据时连通一起删除外表中数据 PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被应用的数据 SET_NULL

1.6K10

Django模型

这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的约束。在这里只是简单的介绍一下。...下面是另外一个模型,和前面的BookInfo模型通过关联起来。...:通过使用models.ForeignKey来设置,ForeignKey的第一个参数是要关联的模型类名,第二个参数是on_delete。...它的常用值可以如下: CASCADE级联,删除主表数据时连通一起删除外表中数据 PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被应用的数据 SET_NULL设置为NULL...,此选项会抛出IntegrityError异常 注意:我们在数据库中,设置的时候需要制定另一张表中关联的字段,但是在Django里并没有指定。

1.9K20

Django学习-第七讲:django 中的常用字段、字段属性,和表关系、操作

因此这里我们首先来介绍下Django中的使用。 类定义为class ForeignKey(to,on_delete,**options)。...第一个参数是引用的是哪个模型,第二个参数是在使用引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE、SET_NULL等。这里以一个实际案例来说明。...删除操作 如果一个模型使用了。...那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下: 1.CASCADE:级联操作。如果对应的那条数据被删除了,那么这条数据也会被删除。...即只要这条数据引用了的那条数据,那么就不能删除外的那条数据。 3.SET_NULL:设置为空。如果的那条数据被删除了,那么在本条数据上就将这个字段设置为空。

3.9K30

【愚公系列】2022年01月 Python教学课程 40-Django框架之模型属性详解

文章目录 一、模型类定义 二、模型类迁移 总结 ---- 一、模型类定义 在models.py 文件中定义模型类,示例如下: from django.db import models # Create...,Django默认以小写app应用名_小写模型类名为数据库表名。...2) 关于主键 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。... 在设置时,需要通过on_delete选项指明主表删除数据时,对于引用表数据如何处理,在django.db.models中包含了可选常量: CASCADE级联,删除主表数据时连通一起删除外表中数据...PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被应用的数据 SET_NULL设置为NULL,仅在该字段null=True允许为null时可用 SET_DEFAULT

1.4K20

Django model,baseModel基类, migrate移行

补充:on_delete在外中必须设置,表示级联关系。 级联关系:例,主表数据删除后,参照表的键值,如何处理。  限制 insert参照表的数据之前,主表必须先登录数据,以避免脏数据产生等。...例:product被删,order也。 DO_NOTHING:不会被级联。例:product被删,order的product不做任何处理SET_DEFAULT:配合default属性使用。...假设A表依赖B表,B记录删除,A表的字段重置为default属性设置的值。SET_NULL:配合NULL=True使用。...假设A表依赖B表,B记录删除,A表的字段重置为NULL, 例:product被删,order的product,重置为NULL注:多对多字段不能设置on_delete级联关系。有空再研究。...它必须在模型创建之前通过migrate在模型上指定。

1.1K30

Django(15)和表关系

删除操作 如果一个模型使用了。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下: CASCADE:级联操作。...如果对应的那条数据被删除了,那么这条数据也会被删除。 PROTECT:受保护。即只要这条数据引用了的那条数据,那么就不能删除外的那条数据。 SET_NULL:设置为空。...如果的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。 SET():如果的那条数据被删除了。...注意:以上这些选项只是Django级别的,数据级别依旧是RESTRICT! 表关系 表之间的关系都是通过来进行关联的。而表之间的关系,无非就是三种关系:一对一、一对多、多对多等。...这个OneToOneField其实本质上就是一个,只不过这个有一个唯一约束(unique key),来实现一对一。 以后如果想要反向引用,那么是通过引用的模型的名字转换为小写的形式进行访问。

2.1K40

Django 2.2文档系列】Model 中的on_delete参数用法

场景 我们用Django的Model时,有时候需要关联。关联时,参数:on_delete的几个配置选项到底是干嘛的呢,你知道吗? 参数介绍 models.CASCADE 级联删除。...Django会模拟SQL约束的行为,在删除此条数据时,同事删除外关联的对象。...比如:用户的有一个关联的是用户的健康记录表,当用户删除时,配置了这个参数的健康记录表中跟这个用户有关的数据也会被删除。...models.SET_NULL 设置关联的内容为null。只有设置了null=True时可用。当数据被删除时,被关联的内容被设置为null。...models.SET_DEFAULT 将的值设置为默认值。必须设置有默认值 。 models.SET()将SET()设置的值作为的值 ,如果传递了callable,则调用它的结果。

1.9K10

django模型中有关系的表删除相关设置

0904自我总结 django模型中有关系的表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 author = models.OneToOneField(to='Author...) 1)关系字段放在AuthorDetail表中:作者删除详情删除,详情删除作者保留 2)作者找详情用 related_name(detail),详情找作者用 字段(author)...(books),书找出版社 字段(publish) 3)db_constraint断开表关联,on_delete规定逻辑关联删除动作,models.DO_NOTHING关联无动作 三.以外字段关联...1)断关联,删除关联表记录,键值置空 db_constraint=False, on_delete=models.SET_NULL, null=True, 2)断关联,删除关联表记录,键值置默认值...2)正向找 字段,反向找 字段related_name 3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置,且一定是级联)

3K20

Django ForeignKey与数据库的FOREIGN KEY约束详解

数据库在高并发的场景下使用约束会有锁问题并且使用会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用。...那么不使用约束的情况下使用 Django ORM 如何实现关联查询两个表呢?这曾是困扰我很久的一个问题,今天终于找到了答案,写出来分享一下。...=True, on_delete=models.SET_NULL, related_name='cities', db_constraint=False) def...参数默认为 on_delete=models.CASCADE,表示使用数据库的级联删除,使用 on_delete=models.SET_NULL 可以使删除 Province 时将关联的 City 表对应的...`name` = xxx; 补充知识:关于Django模型中中定义auto_now=True 数据库中的时间并没有自动更新 django的orm关于更新数据库的方法有update和save两种方法

2.5K10

Django model 层之Models与Mysql数据库小结

myapp_album.artist列引用mapp_musician.auto_id字段的值,即mapp_musician.auto_id为myapp_album表的。...删除被参照表的某条表记录,同时级联删除参照表中,同待删除记录存在外关联关系的记录。 PROTECT 删除被参照表中的某条表记录,如果参照表中,存在与该记录有关系的记录,则不让删除。...SET_NULL 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外关联的记录的列值为null。当且仅当设置了null=True选项时可用。...SET_DEFAULT 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外关联的记录的列值为默认值。必须为列设置默认值。...SET() 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外关联关系的记录的列值为传递给SET()的参数值,如果传递给SET()的参数值是可调用对象,则设置为调用可调用对象获取的结果。

2.2K20

Django实战-调查问卷表设计优化

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...如果项目有另外一个需求,也需要与SurveryRecord建立关系,那么此时应该怎么做呢?是再给上面的表增加一个,然后重新修改数据库么?...=256) surveryrecord = GenericRelation("SurveryRecord") 如果一个表与其它表有多个关系,可以通过ContentType来解决这种关联 class..., blank=True, null=True, on_delete=models.SET_NULL) survery_item = models.ForeignKey('SurveryItem...', verbose_name="调查项", blank=True, null=True, on_delete=models.SET_NULL) content_type = models.ForeignKey

1.8K20

Django中的关系映射

models.PROTECT:抛出ProtectedError以阻止被引用对象的删除 SET_NULL:设置ForeignKey为Null,需要指定null=True from django.db import...=models.CASCADE) # 一对一即users_id 对应 id 一对一映射(创建数据) ---- 无约束的模型类UserMit # 进入Django Shell操作 create1 =...UserMit.objects.create(name="henan) 有约束的模型类UserId create2 = UserId.objects.create(name="henan",users...,则为查询 # 通过绑定的users_id查询用户,接着上面的创建数据来 >>> a2.id 6 >>> a2.users_id UUID('43ff679f-42b2-4334-85a0...-b493503d6433') 反向查询 没有属性的一方,可以调用反向属性查询到关联的另一方 反向关联的属性为实例对象.引用类名(小写) 当反向引用不存在的时候,则会触发异常 当

1.7K20

【云+社区年度正文】Django从入门到精通No.2----模型

django从入门到精通No.2----模型 一、前言 学过orm系统自然之道模型的重要性,很多web站点都需要与数据库交互,这个时候模型的设计就显得尤为重要,一个好的模型会使得项目方便管理并且易于维护...1.多对一 因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个的操作,即ForeignKey字段,而且要定义在多的一方。...limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型 db_constraint=True # 是否在数据库中创建约束...parent_link=False # 在Admin中是否显示关联数据 2.多对多 多对多的表,必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的...through_fields=None # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表 db_constraint=True # 是否在数据库中创建约束

2.1K00

Django学习笔记之Django QuerySet的方法

一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get、filter、exclude、delete神马的感觉就已经无所不能了,但随着项目业务逻辑越来越复杂...是啊是啊,删除普通数据的时候当然木有什么,但是如果删除外健关系很复杂的object时有木有想过细节?...嗯,实话告诉你,默认情况下调用delete()是会删除所有有关的对象的(是不是突然感觉自己之前代码里有坑了)所以我们需要详细说说这个方法,如何做才能让他不删除对应的或者说按照我们想象的方式进行删除呢...答案在这里: django.models 的 on_delete参数,此参数有以下几个可选值: CASCADE:这就是delete()的默认选项,也就是关联删除 PROTECT:如果删除的model obj...含有则引起 ProtectedError SET_NULL:就是把置空咯,当然前提是你得设置null=True SET_DEFAULT:就是把设为默认咯,当然前提是你得设置的default

58050

Django 学习笔记之模型高级用法(上)

2.1 ForeignKey 1) on_deleteDjango 2.0 中,设置时需要添加一个 on_delete选项。本身涉及到两个表的数据,况且在数据库中是有约束行为。...SET_NULL: 置空模式,删除的时候,字段被设置为空,前提就是`blank=True, null=True`,定义该字段的时候,允许为空。...SET_DEFAULT: 置默认值,删除的时候,字段设置为默认值,所以定义的时候注意加上一个默认值。 SET(): 自定义对应的实体的值。...2)limit_choices_to 该参数用于限制所能关联的对象,只能用于 Django 的 ModelForm(Django的表单模块)和 admin 后台,对其它场合无限制功能。...4) related_name 用于关联对象反向引用模型的名称。主要用于反向查询,即模型实例通过管理器返回第一个模型的所有实例。

2K30

django数据库迁移时候异常

django数据库迁移时候异常 一.错误信息 Django在根据models生成数据库表时报 init() missing 1 required positional argument: 'on_delete...' 二.原因 在django2.0后,定义和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: TypeError: init() missing...1 required positional argument: 'on_delete' 三.解决方法 加上字段 举例 举例说明: user=models.OneToOneField(User) owner...)是默认值 参数说明: on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值 CASCADE:此值设置,是级联删除。...SET_NULL:此值设置,会把设置为null,前提是允许为null。 SET_DEFAULT:此值设置,会把设置为的默认值。 SET():此值设置,会调用外面的值,可以是一个函数。

49420
领券