对django2.0 关联表的必填on_delete参数的含义解析


Posted in Python onAugust 09, 2019

一对多(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 参数,所以略过不提.

以上这篇对django2.0 关联表的必填on_delete参数的含义解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
python获取list下标及其值的简单方法
Sep 12 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
Django 批量插入数据的实现方法
Jan 12 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 #Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 #Python
基于django ManyToMany 使用的注意事项详解
Aug 09 #Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 #Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 #Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 #Python
python操作excel让工作自动化
Aug 09 #Python
You might like
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php实现Session存储到Redis
2015/11/11 PHP
深入浅析php json 格式控制
2015/12/24 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
如何用python整理附件
2018/05/13 Python
Python的pygame安装教程详解
2020/02/10 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
JSF如何进行表格处理及取值
2012/08/06 面试题
几个常见的软件测试问题
2016/09/07 面试题
触摸春天教学反思
2014/02/03 职场文书
课内比教学心得体会
2014/09/09 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2014年材料员工作总结
2014/11/19 职场文书
网络管理员岗位职责
2015/02/12 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
护士旷工检讨书
2015/08/15 职场文书