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 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
python爬取淘宝商品销量信息
Nov 16 Python
学习和使用python的13个理由
Jul 30 Python
详解Python打包分发工具setuptools
Aug 05 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 Python
Python csv文件记录流程代码解析
Jul 16 Python
如何把python项目部署到linux服务器
Aug 26 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 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 screw加密php源代码
2013/06/20 PHP
PHP多态代码实例
2015/06/26 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
php实现登录页面的简单实例
2019/09/29 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
canvas知识总结
2017/01/25 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python pyheatmap包绘制热力图
2018/11/09 Python
python画图的函数用法以及技巧
2019/06/28 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
为什么相对PHP黑python的更少
2020/06/21 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
北京SQL新华信咨询
2016/09/30 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
管理站站长岗位职责
2013/11/27 职场文书
企划专员岗位职责
2013/12/09 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python