django ORM 外键详解
Django中的外键:
首先,为了方便理解,我们把使用ForeignKey的字段所在的表定义为从表,把ForeignKey中to参数连接的表称为主表。
外键使用的先决条件:
在mysql数据表中,数据引擎有很多种,最常用的就是InnoDB和MyISAM,只有主表和从表的数据库引擎都是InnoDB时,表与表之间才能使用外键连接
外键介绍:
外键在django的ORM连表操作时非常常用,在django中我们使用ForeignKey作为关键词去定义外键,下面是ForeignKey的构造方法:
def __init__(self, to, on_delete, related_name=None, related_query_name=None,limit_choices_to=None, parent_link=False, to_field=None,db_constraint=True, **kwargs):
我们在django的ORM中定义ForeignKey时必需要传递的参数是to和on_delete,其他参数为选填,下面我们来解释一下这些参数:
to:需要传递被外键连接的主表模型作为值,如果连接时主表模型还没定义,建议使用主表模型类名加上"",这样就不会报错
on_delete:需要传递当主表中的一条数据删除时,从表中与这条数据相关联的数据要执行怎样的动作,注意这个参数定义的是主表上的一条数据删除时从表上与之关联的数据的动作(如果是从表上的这条数据删除则与主表上的数据无关)
class Book(models.Model):
name = models.CharField(max_length=64,blank=True)
content = models.TextField(blank=True)
pub_time = models.DateTimeField(auto_now_add=True)
publisher = models.ForeignKey(to="Publisher",on_delete=models.SET_NULL,null=True)
class Publisher(models.Model):
name = models.CharField(max_length=64,blank=True)
mobile = models.CharField(max_length=11,unique=True)
注:如果从表中某个字段使用ForeignKey,然后这个字段没有传递db_index,django会默认为这个字段传递一个db_index=True的参数
外键的删除操作详解:
1、models.CASCADE:级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL:当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT:当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT:当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值,其实这个
class Publisher(models.Model):
name = models.CharField(max_length=64,blank=True)
mobile = models.CharField(max_length=11,unique=True)
class Book(models.Model):
name = models.CharField(max_length=64,blank=True)
content = models.TextField(blank=True)
pub_time = models.DateTimeField(auto_now_add=True)
publisher = models.ForeignKey(Publisher,on_delete=models.SET_DEFAULT,null=True,
default=Publisher.objects.get(pk=2),related_name='book')
其实,default也可以是一个函数(在任意字段均可),此时可以,注意这时只传递函数名称,django在操作时会帮我们自动执行:
def publisher():
return Publisher.objects.get(pk=1)
class Book(models.Model):
name = models.CharField(max_length=64,blank=True)
content = models.TextField(blank=True)
pub_time = models.DateTimeField(auto_now_add=True)
publisher = models.ForeignKey(Publisher,on_delete=models.SET_DEFAULT,null=True,
default=publisher,related_name='book')
5、models.SET():当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
def publisher():
return Publisher.objects.get(pk=1)
class Book(models.Model):
name = models.CharField(max_length=64,blank=True)
content = models.TextField(blank=True)
pub_time = models.DateTimeField(auto_now_add=True)
publisher = models.ForeignKey(Publisher,on_delete=models.SET(publisher),null=True,related_name='book')
6、models.DO_NOTHING:什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
django ORM 外键详解的更多相关文章
- Django - orm外键操作
1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...
- django orm 外键id返回对应的名称
原文:https://blog.csdn.net/gghhm/article/details/99652143 当我们在写django的orm模块时,有时候会在用外键关联时,保存的是对应表中的id字段 ...
- django orm 数据查询详解
一 在django里面创建模型 from django.db import models class Blog(models.Model): name = models.CharField(max_l ...
- mysql外键详解
1.1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引.用于外键关系的字段必须在所有的参 ...
- mysql 添加外键详解
为已经添加好的数据表添加外键: 语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字 ...
- Django学习笔记之Django ORM Aggregation聚合详解
在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djngo聚合就能满足这些要求. 以下面的Mode ...
- Python - Django - ORM 外键操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- Django(四) ORM 外键操作及初识Ajax
一.内容回顾 1.Django请求的生命周期: 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
随机推荐
- HDU 1011 Starship Troopers星河战队(树形dp)
题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...
- mustache.js 数组循环的索引
在使用mustache作为模板引擎时,想要利用数组中的对象的索引排序,却发现mustache中无法获得数组索引,在一番搜索之后,发现在数组的对象中加入索引,就可以了,示例如下 /html {{#dat ...
- 允许被ping设置方法
参考下图设置:
- Miller-Rabbin 素性测试 和 Pollard_rho整数分解
今天学习一下Miller-Rabbin 素性测试 和 Pollard_rho整数分解. 两者都是概率算法. Miller_Rabbin素性测试是对简单伪素数pseudoprime测试的改进. (ps ...
- Java不同对象之间复制属性
// 导入包import org.springframework.beans.BeanUtils; /** * 调用工具复制2个对象之间的属性 2个JavaBean对象复制的属性名相同 * @para ...
- hadoop + ssh 配置
1.输入 2.解决上述问题 3. 4.去掉登陆密码 5.不用密码登陆
- JDBC 基本语法总结
实现JDBC操作: 静态SQL执行 ① 注册驱动 Class.forName("com.mysql.jdbc.Driver"); ② 创建连接 Connection con = D ...
- MySQL派生表(derived)优化一例
1.什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql; +----+-------------+------------+------+-------- ...
- SPOJ1043 GSS1(线段树)
题意 给出$n$个数,每次询问区间$(l, r)$内最大字段和 Sol 在合并子树的时候,答案仅有四种情况 打四个标记维护即可 查询同理,用类似update的方式合并 注意查询的时候不能按照以前的方式 ...
- mybatis中实现动态SQL
动态SQL语句,也就意味着SQL语句不在是一成不变的而是具有多样性. if if的用法还是跟平常差不多的(不过没有else if也没有else) <update id="modify& ...