首页 > 其他分享 >【补充】on_delete的参数详解

【补充】on_delete的参数详解

时间:2023-07-31 12:34:26浏览次数:40  
标签:删除 models 外键 关联 对象 详解 参数 publish delete

【补充】on_delete的参数详解

models.CASCADE(级联删除):

当删除与该字段关联的对象时,所有相关的对象将被级联删除。例如,如果一个出版社对象被删除了,与该出版社相关联的所有图书对象也会被删除。

models.SET_DEFAULT:(设置为默认值):

当删除与该字段关联的对象时,该字段的值将设置为字段的默认值。这要求你同时定义了一个默认值。例如,如果一个出版社对象被删除了,与该出版社相关联的图书对象的出版社字段将被设置为默认的出版社。

models.SET_NULL:(设置为空):

  • 当删除与该字段关联的对象时,该字段的值将被设置为NULL,即空。这要求你将该字段设置为可为空。例如,如果一个出版社对象被删除了,与该出版社相关联的图书对象的出版社字段将被设置为空。

models.SET():(设置为指定值或执行函数):

  • 当删除与该字段关联的对象时,该字段的值将被设置为指定的值或执行指定的函数。你可以传递一个值作为参数,也可以传递一个函数,该函数将在删除关联对象时执行并返回一个值。例如,你可以设置一个函数,将与删除的出版社对象创建时间相关的特定日期作为图书对象的出版日期。

models.DO_NOTHING():(什么都不做):

  • 当删除与该字段关联的对象时,不会进行任何操作。这意味着数据库中的关联完整性约束将被忽略,并且你需要确保在应用层面处理好相关的逻辑。要在使用这个选项时生效,你需要将db_constraint参数设置为False,以避免在数据库级别建立外键约束。

【补充】逻辑外键

  • 逻辑外键是指在数据库中没有直接建立外键约束,但在应用程序的逻辑层面上表达了两个实体之间的关联关系。
  • 与物理外键不同,逻辑外键不会限制或强制执行数据的完整性。

优点:

  • 增删查改数据快:
    • 由于没有物理外键的约束,操作数据时不需要考虑维护和检查外键完整性,因此执行增删查改操作的效率更高。

缺点:

  • 容易出现脏数据:

    • 没有物理外键约束的情况下,存在风险引入脏数据或不一致数据。
    • 例如,当删除了一个关联对象时,没有物理外键约束可以阻止该对象在其他地方被引用。
  • 在实际应用中是否建立物理外键约束往往取决于具体的需求、系统设计和团队工作流程。

    • 在某些情况下,使用逻辑外键而不建立物理外键可以提高数据库操作的性能和灵活性。
    • 然而,这也意味着需要在应用层面上自行处理关联对象的完整性和数据一致性。
    • 团队需要通过其他方式来控制和保障数据的完整性,例如编写合适的验证逻辑或者使用事务等技术手段。
  • 总结而言,逻辑外键提供了一种灵活的方式来表达实体之间的关联关系,并且可以在特定情况下提高数据库操作的性能。

  • 然而,它也带来了管理和维护数据完整性的挑战,需要开发团队仔细评估和权衡使用该方法的利弊以及适应性。

【准备数据】

from django.db import models


# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)

    # on_delete
    # models.CASCADE: 级联删除,只要删除 publish ,跟publish关联的book,全部被删除
    # models.SET_DEFAULT: 只要删除 publish ,跟publish关联的book,publish的字段都会变成默认值,(建议配合default一起使用)
    # models.SET_NULL: 只要删除 publish ,跟publish关联的book,publish的字段都会变成空,(建议配合null一起使用)
    # models.SET(): (放个值),只要删除 publish ,跟publish关联的book,publish的字段都会set设的值或执行函数
    # models.DO_NOTHING(): 什么都不做,但是它需要跟db_constraint=False 配合,表示不建立外键约束,创建逻辑外检,而不是物理外检
    # 逻辑外检:虽然有外键关系但不会约束外键的数据存储要求
    # 不建立物理外键的好处?
    # 优点:增删查改数据快
    # 缺点:容易出现脏数据
    # 在实际应用中,都不建立物理外检而是建立逻辑外键
    publish = models.ForeignKey(to="Publish", on_delete=models.SET_NULL, null=True, blank=True)
    authors = models.ManyToManyField(to="Author")


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=11)
    # 本质上就是foreignkey,但是唯一,多的方是唯一,形成了一对一
    author_detail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    email = models.CharField(max_length=32)
    age = models.IntegerField()

【示例参考】

标签:删除,models,外键,关联,对象,详解,参数,publish,delete
From: https://www.cnblogs.com/dream-ze/p/17593149.html

相关文章

  • 【补充】Django配置文件中的参数的作用
    Settings.py中的配置的作用【1】路径相关#pathlib:3.8+以后的模块,跟路径相关frompathlibimportPath#(1)项目根目录路径BASE_DIR=Path(__file__).resolve().parent.parent上述内容是在Django项目配置文件中使用pathlib模块设置项目根目录路径的操作。在Python......
  • spring RestTemplate用法详解
    前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json、结合xml的view显示xml文档。那么这些数据除了在WebBrowser中用JavaScript来调用以外,还可以用远程服务器的Java程序、C#程序来调用。也就是说现在的程序不仅在BS中能调用,在CS中同样也能调用,不过你需要......
  • 工业机器人坐标系详解(基于六轴串联机器人和SCARA机器人)
    工业机器人的坐标系机器人的坐标系是重中之重,它是理解机器人运动的基础。机器人所有运动的点位都是建立在坐标系的基础之上,所以如果坐标系不理解,那么就很难真实了解机器人是如何运动的。什么是坐标系?我们需要移动机器人来工作,但是如何让机器人移动?当然我们可以单独控制机器人的......
  • window.open()参数传递及获取
    window.open()参数传递及获取原文链接:https://wenku.csdn.net/answer/cd7f78922c64bad2c7854b55a947fcc0window.open()是JavaScript中打开新窗口的方法。它可以接受三个参数,分别是要打开的URL、窗口名称和窗口特性。其中,窗口特性可以是一个字符串,包含多个用逗号隔开的键值对,用于......
  • Spring中的设计模式详解
    Spring中的设计模式详解​JDK中用到了哪些设计模式?Spring中用到了哪些设计模式?这两个问题,在面试中比较常见。我在网上搜索了一下关于Spring中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远。所以,花了几天时间自己总结了一下,由于我的个人能力有限,文中如有任何错误各......
  • 怎么还有函数参数不支持引用的?(Excel函数集团)
    函数公式中的参数绝大部分情况下是可以用以下四种:常量引用公式运算(包括函数、四则运算等)自定义名称有少部分函数的参数只支持引用,比如Sumif的第一、第三参数,Subtotal除第一参数以外的其他所有参数等等。但是,有一个函数的参数的特殊用法,只要是引用就会甩脸子,这个函数就是XL......
  • 【微服务】springboot 多模块打包使用详解
    目录一、前言1.1为什么需要掌握多模块打包二、工程模块概述2.1前后端不分离2.2部署方式多样化2.3单模块向多模块演进三、单模块打包构建3.1环境准备3.1.1创建测试用的单模块工程3.1.2多环境配置文件3.1.3新增测试接口3.2pom配置详解3.2.1添加基础依赖3.2.2多环境配置3.2......
  • C++入门:缺省参数
    1.缺省参数的概念缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的参数。#include<iostream>usingnamespacestd;voidFunc(inta=0){ cout<<a<<endl;}intmain(){ Func(); Func(1);......
  • BGP中的preferred-value参数
    需求:1、AR4network发布一条路由2、AR1会从两个方向收到路由,如果我们改变选路,可以修改此参数实际配置:首先:抓出数据流ipip-prefix2index10permit100.1.1.132第二步:匹配数据route-policypre_valuepeimitnode10if-matchip-prefix2applypreferred-value2//可以取值0-65......
  • python argparse—用于命令行选项、参数和子命令的解析器
    参考:https://docs.python.org/3/library/argparse.htmlargparse.ArgumentParser:创建Parser对象语法格式class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-......