django数据模型on_delete, db_constraint的使用详解


Posted in Python onDecember 24, 2019

# 半夜撸代码  正在一顿操作猛如虎的时候,发现删了其中一张表的某条记录,结果发现其他表跟这个字段的关联的也都被删除,我已经写了db_constraint=False 难道我用错了,最后只能查资料,原来想断关联还想连表查询做这个是不够的,还需要null=True, blank=True,on_delete=models.SET_NUL这里我之前写的是on_delete=models.CASCADE 默认级联删除,坑了自己一把,还有昨天晚上也是,后台写好,万事具备的时候,准备开撸前台,ajax请求就是不通,各种改地址 端口,最后居然是配置里'corsheaders.middleware.CorsMiddleware'这个没加,唉,撸个代码配环境还要配几个小时?

1.设置为null

class BookModel(models.Model):
  """
  图书
  """
  book_name = models.CharField(max_length=100, verbose_name='书名')
  # 表示外键关联到作者表,当作者表删除了该条数据,图书表中不删除,仅仅是把外键置空
  author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
  price = models.FloatField(verbose_name='价格')
  create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')

2.建表时其他参数的设置

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

3.set的使用

def get_sentinel_user():
  return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
  user = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    on_delete=models.SET(get_sentinel_user),
  )

4.ManyToMany参数(through,db_constraint)

class Book(models.Model):
  name=models.CharField(max_length=20)
  authors=models.ManyToMany('Author',through='Score')


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


class Score(models.Model):
  book=models.ForeignKey('Book')
  author=models.ForeignKey('Author')
  socre=models.IntegerField()

如果只写manytomany,那么第三张是Django替我们建的,可以通过book.authors字段进行一系列操作(add(增),all(查),set(重置),remove(删除)),但是此时没法给第三张表加其他我们需要的字段,

而如果不写,ManyToMany字段,那么我们可以通过Score来执行一些操作,但是此时book和author表已经没有直接的联系了,查询起来很繁琐

有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便业务,添加需要的字段

5.db_constraint

db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一般公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)

limit_choices_to
限制关联字段的对象范围

related_name
反向查询字段可以不用 表名小写,可以改名了

db_table
第三张表的名字

models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL,db_constraint=False)

5.总结

如果使用两个表之间存在关联,首先db_constraint=False 把关联切断,但保留连表查询的功能,其次要设置null=True, blank=True,注意on_delete=models.SET_NULL 一定要置空,这样删了不会影响其他关联的表

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python语言生成水仙花数代码示例
Dec 18 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python学习笔记之While循环用法分析
Aug 14 Python
python3实现高效的端口扫描
Aug 31 Python
Python @property使用方法解析
Sep 17 Python
给我一面国旗 python帮你实现
Sep 30 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
pytorch 实现变分自动编码器的操作
May 24 Python
python百行代码实现汉服圈图片爬取
Nov 23 Python
Python中filter与lambda的结合使用详解
Dec 24 #Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 #Python
Python 3 使用Pillow生成漂亮的分形树图片
Dec 24 #Python
python保存log日志,实现用log日志画图
Dec 24 #Python
Django 限制访问频率的思路详解
Dec 24 #Python
python 统计文件中的字符串数目示例
Dec 24 #Python
如何基于python操作json文件获取内容
Dec 24 #Python
You might like
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
js读取cookie方法总结
2014/10/31 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
详解JavaScript的回调函数
2015/11/20 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
接口中的方法可以是abstract的吗
2015/07/23 面试题
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
建筑个人求职信范文
2014/01/25 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
酒店端午节活动方案
2014/08/26 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
城南旧事读书笔记
2015/06/29 职场文书
公司管理建议书
2015/09/14 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server