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 相关文章推荐
Eclipse + Python 的安装与配置流程
Mar 05 Python
Python Web框架Flask中使用七牛云存储实例
Feb 08 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
python实现单链表的方法示例
Sep 03 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
python time.strptime格式化实例详解
Feb 03 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 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
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php数组合并的二种方法
2014/03/21 PHP
php字符串截取函数用法分析
2014/11/25 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
寻找网站后台地址的python脚本
2014/09/01 Python
详解Python中的循环语句的用法
2015/04/09 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
Python 多维List创建的问题小结
2019/01/18 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
Python如何实现单例模式
2016/06/03 面试题
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
中国文明网签名寄语
2014/01/18 职场文书
给领导的检讨书
2014/02/16 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
2014年党委工作总结
2014/11/22 职场文书
Python集合set()使用的方法详解
2022/03/18 Python