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修改字典内key对应值的方法
Jul 11 Python
Python实现完整的事务操作示例
Jun 20 Python
python检索特定内容的文本文件实例
Jun 05 Python
python使用Matplotlib画条形图
Mar 25 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
python手写均值滤波
Feb 19 Python
python Zmail模块简介与使用示例
Dec 19 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
在Python中如何使用yield
Jun 07 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模板引擎SMARTY
2006/10/09 PHP
CI框架常用方法小结
2016/05/17 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Django--权限Permissions的例子
2019/08/28 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
市场营销专业个人自荐信格式
2013/09/21 职场文书
工程资料员岗位职责
2014/03/10 职场文书
气象学专业个人求职信
2014/03/15 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
安全标语口号
2014/06/09 职场文书
党员评议个人总结
2014/10/20 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
2015公务员年度考核评语
2015/03/25 职场文书