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中的权限和组以及消息
Jul 23 Python
深入理解Django的中间件middleware
Mar 14 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
python检测服务器端口代码实例
Aug 31 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
python中mongodb包操作数据库
Apr 19 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计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
php 数组元素快速去重
2017/05/05 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
javascript 特殊字符串
2009/02/25 Javascript
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
python配置文件写入过程详解
2019/10/19 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
NET程序员上机面试题
2015/05/23 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
中学门卫岗位职责
2013/12/26 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
付款证明格式范文
2015/06/19 职场文书
改进工作作风心得体会
2016/01/23 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android