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 相关文章推荐
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
儿童编程python入门
May 08 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
Flask框架单例模式实现方法详解
Jul 31 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
使用python+whoosh实现全文检索
Dec 09 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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文本数据库的搜索方法
2006/10/09 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
Three.js快速入门教程
2016/09/09 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
Jupyter加载文件的实现方法
2020/04/14 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
技术股份合作协议书
2014/10/05 职场文书
工资证明范本
2015/06/12 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
java开发双人五子棋游戏
2022/05/06 Java/Android