Python Django orm操作数据库笔记之外键和表关系
外键
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。
外键的使用
- 使用外键前需要先确保相应外键已存储在数据库中(flask中会在你引用时自动保存相应外键)。
- 如果想要引用另外一个
app的模型,那么应该在传递to参数的时候,使用app.model_name进行指定。 - 如果模型的外键引用的是本身自己这个模型,那么
to参数可以为'self',或者是这个模型的名字。
外键的删除
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:
- CASCDE:级联删除,即如果这条数据中外键对应的数据被删除了,那么这条数据也将被删除。
- PROTECT:受保护。如果要删除这条数据中外键对应的数据,系统将会报错,即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
- SET_NULL:设置为空,即如果这条数据中外键对应的数据被删除了,那么这条数据的相应字段将设置为空。需要注意,使用这个方法需保证当前字段可以为空,可用null=True的方法来设置。
- SET_DEFAULT:设置为默认值,即如果这条数据中外键对应的数据被删除了,那么这条数据的相应字段将设置为默认值。需要注意,使用这个方法需保证当前字段已指定默认值,可用default=(某固定值/函数)的方法来设置。
- SET():功能与SET_DEFAULT类似,即如果外键对应的那条数据被删除了。那么将会获取
SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。 - DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。
表关系
表之间的关系都是通过外键来进行关联的。而表之间的关系,无非就是三种关系:一对一、一对多(多对一)、多对多等。以下将讨论一下三种关系的应用场景及其实现方式。
注:在`一对多(多对一)`的情况下`多`的那方是`外键的引用方`也就是模型属性包含相应外键的那方,`一`的那方是`被外键引用的那方`也就是模型属性不包含相应外键的那方
一对多
- 场景说明:比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。
- 如果当前模型被其他模型通过外键的形式引用,那么django会自动为该模型生成一个方法,该方法通过引用模型名的小写 + _ + set的形式调用,这个方法与一般模型中的objects方法类似,可使用all()、get(),first()、filter()等方法获取里面的数据。如果需要将一篇文章添加到某个
Python Django orm操作数据库笔记之外键和表关系的更多相关文章
- Python Django orm操作数据库笔记之QuerySet API
什么时候Django会将QuerySet转换为SQL去执行: 根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片 ...
- Django ORM操作数据库常用API
昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进 ...
- django orm 改动数据库中已存在的表(添加、删除、修改表字段)
python3 manage.py makemigrations --empty api # 因为我的models.py文件并直接在项目根目录,而是根目录下的api目录中 python3 manage ...
- Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作
静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...
- [oldboy-django][2深入django]ORM操作
推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...
- python——django使用mysql数据库(二)
上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...
- 数据库开发-Django ORM的数据库迁移
数据库开发-Django ORM的数据库迁移 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. Django 项目准备 1>.安装django包 pip install d ...
- python MySQLdb用法,python中cursor操作数据库(转)
数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST_NAME, LAST_N ...
- python——django使用mysql数据库(一)
之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...
随机推荐
- html5的websocket
转载:http://blog.csdn.net/liuhe688/article/details/50496780 var WebSocketServer = require('ws').Server ...
- python学习(六)
- javaScript_Demo 全选和反选单选框
进行单选的全选和反选 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- restore not found的错误
tensorflow保存模型后,restore的时候报参数not found是什么原因呢 一般预测的流程是:建图然后restore参数,很有可能你的变量作用域和train的时候不一样,那么在现在的变量 ...
- UTC,BJT时间的换算
题目内容:UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小时小于10,则没有千位 ...
- angular学习2
1.为了在angular里面使用bootstrap,可以如下操作 (1)停止正在运行的终端指令:ctrl+c (2)在终端里面输入:npm install bootstrap --save (3)在V ...
- ES6--闭包数组i的值与var的作用域理解
var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10 变 ...
- nginx原理及使用
Nginx的特点: 方便 简单 灵活 比较具有发展潜力的服务软件 在性能上占用的系统资源更少 能支持更多的并发连接 , 特别是静态小文件场景下, 达到更的访问效率.Nginx是什么? Nginx是一个 ...
- C语言函数的存储类别
函数默认的隐含存储类型是extern auto:只能用于局部变量 extern:允许被其他文件调用 static:只能被本源程序文件调用
- ES6新特性,对象的快速创建
//es6对象快速赋值 //es5对象赋值 var name="xiaoming"; var age=18 var person={ name:name, age:age } co ...