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 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
java直接调用python脚本的例子
Feb 16 Python
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
django admin组件使用方法详解
Jul 19 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Opencv中cv2.floodFill算法的使用
Jun 18 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 和 MySQL 基础教程(四)
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
global.php
2006/12/09 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
python进程与线程小结实例分析
2018/11/11 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
python字符串替换的2种方法
2014/11/30 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
python 初始化一个定长的数组实例
2019/12/02 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
电话销售经理岗位职责
2013/12/07 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
公司会计岗位职责
2014/02/13 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
社区科普工作方案
2014/06/03 职场文书
娱乐节目策划方案
2014/06/10 职场文书
工程部岗位职责
2015/02/10 职场文书
六年级语文教学反思
2016/03/03 职场文书