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使用MD5加密字符串示例
Aug 22 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python绘图模块matplotlib示例详解
Jul 26 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
对python中的*args与**kwgs的含义与作用详解
Aug 28 Python
python数据类型可变不可变知识点总结
Mar 06 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
python两种注释用法的示例
Oct 09 Python
Python基于template实现字符串替换
Nov 27 Python
python playwright 自动等待和断言详解
Nov 27 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目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
ThinkPHP发送邮件示例代码
2016/10/08 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
python argparser的具体使用
2019/11/10 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python爬取天气数据的实例详解
2020/11/20 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
2019史上最全Database工程师题库
2015/12/06 面试题
应届中专生自荐书范文
2014/02/13 职场文书
迎新晚会策划方案
2014/06/13 职场文书
python实现高效的遗传算法
2021/04/07 Python
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
CPU不支持Windows11系统怎么办
2021/11/21 数码科技