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

drop even thou on_delete=CASCADE上Django外键约束

基础概念

在Django中,on_delete参数用于定义当一个模型实例被删除时,与之关联的外键实例应该如何处理。CASCADE是其中一种选项,表示当一个模型实例被删除时,所有依赖于它的实例也会被自动删除。

相关优势

  • 数据一致性:使用CASCADE可以确保数据的一致性,避免孤立的数据记录。
  • 简化操作:开发者无需手动删除关联数据,减少了出错的可能性。

类型

Django提供了多种on_delete选项,包括:

  • CASCADE:级联删除。
  • PROTECT:防止删除,如果有关联数据存在。
  • SET_NULL:设置外键为NULL(如果允许)。
  • SET_DEFAULT:设置外键为默认值(如果定义了默认值)。
  • SET():设置外键为指定的值。
  • DO_NOTHING:什么都不做,可能会导致数据库完整性问题。

应用场景

CASCADE通常用于一对多或多对多的关系中,例如:

  • 当删除一个用户时,自动删除该用户的所有订单。
  • 当删除一篇文章时,自动删除所有相关的评论。

可能遇到的问题及解决方法

问题1:误删关联数据

原因:使用CASCADE可能导致意外删除重要数据。

解决方法

  1. 谨慎使用:只在确实需要级联删除时使用CASCADE
  2. 备份数据:在执行删除操作前,确保数据已备份。

问题2:性能问题

原因:级联删除可能涉及大量数据的删除操作,导致性能下降。

解决方法

  1. 分批删除:如果数据量较大,可以考虑分批删除。
  2. 优化数据库:确保数据库索引和查询优化,以提高删除操作的效率。

示例代码

假设有两个模型AuthorBookBook通过外键关联到Author

代码语言:txt
复制
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在这个例子中,当一个Author实例被删除时,所有关联的Book实例也会被自动删除。

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

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

相关·内容

django 引用自身和on_delete参数

= models.ForeignKey('self',on_delete=models.CASCADE) on_delete参数如下: CASCADE:级联操作。...如果的那条数据被删除了,那么本条数据就将这个字段设置为默认值。如果设置这个选项,== 前提是要指定这个字段一个默认值 ==。 SET():如果的那条数据被删除了。...、update的时候,子表会将关联记录的字段所在列设为null,所以注意在设计子表时不能设为not null; 为什么在django中可以是用不同的约束去操作数据库呢。...比如 djangoon_delete=CASCADE, 但是数据库的约束是RESTRICT....在进行删除A表数据时,发现被约束着,使数据不能被删除,则django会先去删除约束的B表数据,然后再来删除A表数据。

1.3K20
  • Django中的关系映射

    级联删除的特殊字段 models.CASCADEDjango模拟SQL约束ON DELETE CASCADE,并删除包含ForeignKey的对象 注意该CASCADE会有限查找是否有关联数据,先删除管理数据...=models.CASCADE) # 一对一即users_id 对应 id 一对一映射(创建数据) ---- 无约束的模型类UserMit # 进入Django Shell操作 create1 =...UserMit.objects.create(name="henan) 有约束的模型类UserId create2 = UserId.objects.create(name="henan",users...一对多需要明确出具体角色,在多表设置 语法:当一个A类对象可以关联多个B类对象 class ClassRoom(models.Model): # 班级唯一 name = models.CharField...: # 学生多个,可以多个学生在一个班 student_name = models.CharField("StudentName",max_length=15) # 绑定约束

    1.7K20

    django 2.x版本中models.ForeignKey()说明介绍

    表示健关联的主键 3、on_delete有多个选项 在django2.0后,定义和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: TypeError...SET_NULL:此值设置,会把设置为null,前提是允许为null。 SET_DEFAULT:此值设置,会把设置为的默认值。 SET():此值设置,会调用外面的值,可以是一个函数。...当我们查询一个组有那些用户的时候,就会用到当前的健, 创建记录 并且,在class中定义了foreignKey之后,group还不存在的同时,user表也因为约束的原因,不能被进行创建 删除记录 并且...’ 解决办法: owner = models.ForeignKey(User, on_delete=models.CASCADE) 以上这篇对django 2.x版本中models.ForeignKey...()说明介绍就是小编分享给大家的全部内容了,希望能给大家一个参考。

    1.2K20

    Django(15)和表关系

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

    2.1K40

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

    数据库在高并发的场景下使用约束会有锁问题并且使用会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用。...那么不使用约束的情况下使用 Django ORM 如何实现关联查询两个表呢?这曾是困扰我很久的一个问题,今天终于找到了答案,写出来分享一下。...Django 的 ForeignKey 是一种逻辑的两个表的关联关系,可以指定是否使用数据库的 FOREIGN KEY 约束。...demo_city_province_id_50fffd49` ON `demo_city` (`province_id`); 如果 ForeignKey 不添加db_constraint=False 参数,会在数据库中使用约束...参数默认为 on_delete=models.CASCADE,表示使用数据库的级联删除,使用 on_delete=models.SET_NULL 可以使删除 Province 时将关联的 City 表对应的

    2.6K10

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

    和表关系 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持约束的。的存在使得ORM框架在处理表关系的时候异常的强大。...因此这里我们首先来介绍下Django中的使用。 类定义为class ForeignKey(to,on_delete,**options)。...可以通过on_delete来指定。可以指定的类型如下: 1.CASCADE:级联操作。如果对应的那条数据被删除了,那么这条数据也会被删除。 2.PROTECT:受保护。...即只要这条数据引用了的那条数据,那么就不能删除外的那条数据。 3.SET_NULL:设置为空。如果的那条数据被删除了,那么在本条数据就将这个字段设置为空。...如果的那条数据被删除了,那么本条数据就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。 5.SET():如果的那条数据被删除了。

    4K30

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

    1.多对一 因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个的操作,即ForeignKey字段,而且要定义在多的一方。...limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型 db_constraint=True # 是否在数据库中创建约束...parent_link=False # 在Admin中是否显示关联数据 2.多对多 多对多的表,必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的...=models.CASCADE) p=models.ForeignKey(people,on_delete=models.CASCADE) dt=models.Datefield() 所有参数如下...through_fields=None # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表 db_constraint=True # 是否在数据库中创建约束

    2.1K00

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

    如果想熟悉 Django 的用法,我认为应该一开始要熟悉一些细节用法,后面再了解 Django 的实现原理。而细节用法往往体现在一些差别用法,难以理解的知识点。...2.1 ForeignKey 1) on_deleteDjango 2.0 中,设置时需要添加一个 on_delete选项。本身涉及到两个表的数据,况且在数据库中是有约束行为。...所以 on_delete 参数是 Django 模拟 SQL 约束的行为。 on_delete 有几个可选值: CASCADE:这就是默认的选项,级联删除,你无需显性指定它。...SET_DEFAULT: 置默认值,删除的时候,字段设置为默认值,所以定义的时候注意加上一个默认值。 SET(): 自定义对应的实体的值。...2)limit_choices_to 该参数用于限制所能关联的对象,只能用于 Django 的 ModelForm(Django的表单模块)和 admin 后台,对其它场合无限制功能。

    2K30

    Sentry 开发者贡献指南 - 数据库迁移

    目录 命令 将您的数据库升级到最新 将您的数据库移动到特定的迁移 为迁移生成 SQL 生成迁移 将迁移合并到 master 指南 过滤器 索引 删除列/表 列 表 重命名表 添加列 向列添加 NOT...在这种情况下,首先删除其他表中的列,然后返回到此步骤。 通过在列上设置 db_constraint=False,删除此表到其他表的任何数据库级约束。...接下来,我们需要删除和 db 级约束。... 创建大多没问题,但是对于像 Project、Group 这样的大/繁忙的表,由于获取锁的困难,它可能会导致问题。您仍然可以创建 Django 级别的,而无需创建数据库约束。...这是因为 Postgres 仍然需要对所有行执行非空检查,然后才能添加约束。在小表这可能没问题,因为检查会很快,但在大表这可能会导致停机。

    3.6K20

    django数据库迁移时候异常

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

    49820

    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,则调用它的结果。

    2K10

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

    0904自我总结 django模型中有关系的表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 author = models.OneToOneField(to='Author...', null=True, related_name='detail', db_constraint=False, on_delete=models.CASCADE...3)db_constraint断开表关联,on_delete规定逻辑关联删除动作,models.CASCADE级联删除 二.一对多 例如Book、Publish两表 publish = models.ForeignKey...(books),书找出版社 字段(publish) 3)db_constraint断开表关联,on_delete规定逻辑关联删除动作,models.DO_NOTHING关联无动作 三.以外字段关联...,反向找 字段related_name 3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置,且一定是级联)

    3K20

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

    =models.CASCADE) 说明:mysql中,生成的列名称,会自动命名为:field_id,如上borrower field对应的mysql列为borrower_id class Musician...可选值: CASCADE 级联删除。模拟sql约束 ON DELETE CASCADE。删除被参照表的某条表记录,同时级联删除参照表中,同待删除记录存在外关联关系的记录。...PROTECT 删除被参照表中的某条表记录,如果参照表中,存在与该记录有关系的记录,则不让删除。...SET_NULL 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外关联的记录的列值为null。当且仅当设置了null=True选项时可用。...SET_DEFAULT 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外关联的记录的列值为默认值。必须为列设置默认值。

    2.2K20
    领券