Django数据模型中on_delete使用详解


Posted in Python onNovember 30, 2020

on_delete属性针对外键ForeignKey

一、django3.0官方文档介绍:

Many-to-one relationships多对一关系

To define a many-to-one relationship, use django.db.models.ForeignKey. You use it just like any other Field type: by including it as a class attribute of your model.

ForeignKey requires a positional argument: the class to which the model is related.

For example, if a Car model has a Manufacturer ? that is, a Manufacturer makes multiple cars but each Car only has one Manufacturer ? use the following definitions:

from django.db import models

class Manufacturer(models.Model):
  # ...
  pass

class Car(models.Model):
  manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
  # ...

 You can also create recursive relationships (an object with a many-to-one relationship to itself) and relationships to models not yet defined; see the model field reference for details.

It's suggested, but not required, that the name of a ForeignKey field (manufacturer in the example above) be the name of the model, lowercase. You can, of course, call the field whatever you want.

常见的使用方式(设置为null)

class ApiList(models.Model):
 desc = models.CharField(max_length=255, verbose_name="接口描述")
 keyword = models.CharField(max_length=100, verbose_name="请求关键字")
 response = models.TextField(verbose_name="响应结果")
 api = models.ForeignKey(Api, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="所属接口")
 status = models.IntegerField(default=1, verbose_name="状态")
 create_at = models.CharField(max_length=20, verbose_name="创建时间")
 update_at = models.CharField(max_length=20, verbose_name="更新时间")

一对多(ForeignKey)

class ForeignKey(ForeignObject):
  def __init__(self, to, on_delete, related_name=None, related_query_name=None,
         limit_choices_to=None, parent_link=False, to_field=None,
         db_constraint=True, **kwargs):
    super().__init__(to, on_delete, from_fields=['self'], to_fields=[to_field], **kwargs)

一对一(OneToOneField)

class OneToOneField(ForeignKey):
  def __init__(self, to, on_delete, to_field=None, **kwargs):
    kwargs['unique'] = True
    super().__init__(to, on_delete, to_field=to_field, **kwargs)

从上面外键(ForeignKey)和一对一(OneToOneField)的参数中可以看出,都有on_delete参数,而 django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:

TypeError: __init__() missing 1 required positional argument: 'on_delete'

因此,整理一下on_delete参数的各个值的含义:

on_delete=None,        # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE,   # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT,   # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,  # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,     # 删除关联数据,
 a. 与之关联的值设置为指定值,设置:models.SET(值)
 b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

多对多(ManyToManyField)

class ManyToManyField(RelatedField):
  def __init__(self, to, related_name=None, related_query_name=None,
         limit_choices_to=None, symmetrical=None, through=None,
         through_fields=None, db_constraint=True, db_table=None,
         swappable=True, **kwargs):
    super().__init__(**kwargs)

因为多对多(ManyToManyField)没有 on_delete 参数,所以略过不提. 

二、on_delete外键删除方式

  1. CASCADE:级联删除。当Manufacturer对象删除时,它对应的Car对象也会删除。
  2. PROTECT:保护模式,采用该选项,删除时会抛出ProtectedError错误。
  3. SET_NULL:置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。当Manufacturer对象删除时,它对应的Car对象的manufacturer字段会置空,前提是null=True
  4. SET_DEFAULT:置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
  5. SET():自定义一个值,该值当然只能是对应的实体了

django3.0关于models官方文档地址:
1.https://docs.djangoproject.com/en/3.0/topics/db/models/
2.https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey

到此这篇关于Django数据模型中on_delete使用详解的文章就介绍到这了,更多相关Django on_delete使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python socket 超时设置 errno 10054
Jul 01 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
浅述python中深浅拷贝原理
Sep 18 Python
Django 配置多站点多域名的实现步骤
May 17 Python
Python中字符串与编码示例代码
May 20 Python
python项目对接钉钉SDK的实现
Jul 15 Python
python实现文件的分割与合并
Aug 29 Python
python 实现生成均匀分布的点
Dec 05 Python
pytorch中[..., 0]的用法说明
May 20 Python
Django数据统计功能count()的使用
Nov 30 #Python
Python常用断言函数实例汇总
Nov 30 #Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 #Python
Django 用户认证Auth组件的使用
Nov 30 #Python
python tqdm库的使用
Nov 30 #Python
Python+unittest+DDT实现数据驱动测试
Nov 30 #Python
Python logging自定义字段输出及打印颜色
Nov 30 #Python
You might like
PHP flock 文件锁详细介绍
2012/12/29 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
2019/04/30 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
瀑布模型都有哪些优缺点
2014/06/23 面试题
个人思想理论学习的自我鉴定
2013/11/30 职场文书
关于期中考试的反思
2014/02/02 职场文书
电力安全事故反思
2014/04/27 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
离婚上诉状范文
2015/05/23 职场文书
交通事故案件代理词
2015/05/23 职场文书
红歌会主持词
2015/07/02 职场文书
三八妇女节主持词
2015/07/04 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
导游词之日本富士山
2020/01/06 职场文书