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中的数据存储到系统本地的简单方法
Apr 11 Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
Python进阶之@property动态属性的实现
Apr 01 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Python如何解除一个装饰器
Aug 07 Python
在python中实现导入一个需要传参的模块
May 12 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
js加强的经典分页实例
2013/03/15 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
python实现人民币大写转换
2018/06/20 Python
python画图的函数用法以及技巧
2019/06/28 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
python getpass实现密文实例详解
2019/09/24 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
美术指导求职信
2014/03/17 职场文书
员工入职担保书范文
2014/04/01 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书