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 相关文章推荐
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
python实现马丁策略的实例详解
Jan 15 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 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与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php object转数组示例
2014/01/15 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
Python魔术方法详解
2015/02/14 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
python的launcher用法知识点总结
2020/08/07 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
解决python3输入的坑——input()
2020/12/05 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
中科前程Java笔试题
2016/11/20 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
《乌塔》教学反思
2014/02/17 职场文书
大学专科自荐信
2014/06/17 职场文书
Python上下文管理器Content Manager
2021/06/26 Python