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实现拼接多张图片的方法
Dec 01 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python探索之Metaclass初步了解
Oct 28 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 Python
Django如何将URL映射到视图
Jul 29 Python
Python3 翻转二叉树的实现
Sep 30 Python
Python 使用生成器代替线程的方法
Aug 04 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
python爬虫破解字体加密案例详解
Mar 02 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下打开URL地址的几种方法小结
2010/05/16 PHP
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
js 提交和设置表单的值
2008/12/19 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
python中遍历文件的3个方法
2014/09/02 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python自动抢红包教程详解
2019/06/11 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
保洁主管岗位职责
2013/11/20 职场文书
大学军训通讯稿
2014/01/13 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
尊师重教演讲稿
2014/09/04 职场文书
小学感恩主题班会
2015/08/12 职场文书
素质教育学习心得体会
2016/01/19 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
python入门之算法学习
2021/04/22 Python