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的面向对象思想分析
Jan 14 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
python3.x实现发送邮件功能
May 22 Python
python实现微信小程序自动回复
Sep 10 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
Python如何给函数库增加日志功能
Aug 04 Python
Python通过format函数格式化显示值
Oct 17 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
Python趣味挑战之实现简易版音乐播放器
May 28 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
phpStorm2020 注册码
2020/09/17 PHP
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
python 字符串split的用法分享
2013/03/23 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Python计算信息熵实例
2020/06/18 Python
python使用建议技巧分享(三)
2020/08/18 Python
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
单位绩效考核方案
2014/05/11 职场文书
环境保护标语
2014/06/20 职场文书
领导工作表现评语
2015/01/04 职场文书
2015年教师节感言
2015/08/03 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
《藏戏》教学反思
2016/02/23 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
浅谈MySQL中的六种日志
2022/03/23 MySQL