Django中ORM外键和表的关系详解


Posted in Python onMay 20, 2019

外键

在 MySQL 中,表有两种引擎,一种是 InnoDB ,另外一种是 myisam 。如果使用的是 InnoDB 引擎,是支持外键约束的。外键的存在使得 ORM 框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在 Django 中的使用。

类定义为 class ForeignKey(to,on_delete,**options) 。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE 、 SET_NULL 等。这里以一个实际案例来说明。比如有一个 User 和一个 Article 两个模型。一个 User 可以发表多篇文章,一个 Article 只能有一个 Author ,并且通过外键进行引用。那么相关的示例代码如下:

class User(models.Model):
  username = models.CharField(max_length=20)
  password = models.CharField(max_length=100)

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()

  author = models.ForeignKey("User",on_delete=models.CASCADE)

以上使用 ForeignKey 来定义模型之间的关系。即在 article 的实例中可以通过 author 属性来操作对应的 User 模型。这样使用起来非常的方便。示例代码如下:

article = Article(title='abc',content='123')
author = User(username='张三',password='111111')
article.author = author
article.save()

# 修改article.author上的值
article.author.username = '李四'
article.save()

为什么使用了 ForeignKey 后,就能通过 author 访问到对应的 user 对象呢。因此在底层, Django 为 Article 表添加了一个 属性名_id 的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过 article.author 访问的时候,实际上是先通过 author_id 找到对应的数据,然后再提取 User 表中的这条数据,形成一个模型。

如果想要引用另外一个 app 的模型,那么应该在传递 to 参数的时候,使用 app.model_name 进行指定。以上例为例,如果 User 和 Article 不是在同一个 app 中,那么在引用的时候的示例代码如下:

# User模型在user这个app中
class User(models.Model):
  username = models.CharField(max_length=20)
  password = models.CharField(max_length=100)

# Article模型在article这个app中
class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()

  author = models.ForeignKey("user.User",on_delete=models.CASCADE)

如果模型的外键引用的是本身自己这个模型,那么 to 参数可以为 'self' ,或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:

class Comment(models.Model):
  content = models.TextField()
  origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
  # 或者
  # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)

外键删除操作:

如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过 on_delete 来指定。可以指定的类型如下:

  1. CASCADE :级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
  2. PROTECT :受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
  3. SET_NULL :设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  4. SET_DEFAULT :设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
  5. SET() :如果外键的那条数据被删除了。那么将会获取 SET 函数中的值来作为这个外键的值。 SET 函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
  6. DO_NOTHING :不采取任何行为。一切全看数据库级别的约束。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
Django forms组件的使用教程
Oct 08 Python
python 生成图形验证码的方法示例
Nov 11 Python
python区块及区块链的开发详解
Jul 03 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
python计算二维矩形IOU实例
Jan 18 Python
python数字类型math库原理解析
Mar 02 Python
基于django和dropzone.js实现上传文件
Nov 24 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python开发简易五子棋小游戏
May 02 Python
利用Django模版生成树状结构实例代码
May 19 #Python
使用Python3内置文档高效学习以及官方中文文档
May 19 #Python
python反编译学习之字节码详解
May 19 #Python
python从入门到精通 windows安装python图文教程
May 18 #Python
详解用Python实现自动化监控远程服务器
May 18 #Python
Python实现打砖块小游戏代码实例
May 18 #Python
如何在Python中实现goto语句的方法
May 18 #Python
You might like
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
jQuery 表格插件整理
2010/04/27 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
jQuery幻灯片特效代码分享--鼠标滑过按钮时切换(2)
2020/11/18 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
详解python变量与数据类型
2020/08/25 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
建筑工程专业毕业生自荐信
2013/10/19 职场文书
会计专业应届生自荐信
2014/02/07 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
毕业证明模板
2015/06/19 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
先进个人主要事迹范文
2015/11/04 职场文书