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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
Python中处理字符串之isalpha()方法的使用
May 18 Python
python numpy 按行归一化的实例
Jan 21 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Python实现决策树并且使用Graphviz可视化的例子
Aug 09 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
python爬虫要用到的库总结
Jul 28 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
python基础之函数的定义和调用
Oct 24 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
php代码架构的八点注意事项
2016/01/25 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
js编码、解码函数介绍及其使用示例
2013/09/05 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
2017/12/21 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python中将字典转换成其json字符串
2014/07/16 Python
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
母婴店促销方案
2014/03/05 职场文书
安全生产活动月方案
2014/03/09 职场文书
学生期末评语大全
2014/04/30 职场文书
新教师培训心得体会
2014/09/02 职场文书
明确岗位职责
2015/02/14 职场文书
教师创先争优承诺书
2015/04/27 职场文书