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 ...
随机推荐
- linux 命令——21 find(转)
在 使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命 令长度有限制,这样在find命令运行几分钟之后,就 ...
- 手把手教你用Docker部署一个MongoDB集群
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引 ...
- 安装mysql提示This application requires .NET framework 4.0.
问题描述:安装MySQL社区版时遇到This application requires .NET framework 4.0. 解决方法:在http://search.microsoft.com/zh ...
- java基础面试题:java中实现多态的机制是什么?
靠的是父类或接口的引用指向子类或实现类的对象, 调用的方法是内存中正在运行的那个对象的方法.
- 问题006:为什么用java.exe执行编译的类文件的时候,不这样写java Welcome.class
为什么用java.exe执行编译的类文件的时候,不这样写java Welcome.class 是因为java虚拟机调用Welcome的时候,已经替我们增减了.class,如果你还要写java Welc ...
- kubernetes搭建dashboard-v1.10.1
一键部署脚本(或者可使用helm安装): wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/ ...
- TP5数据库操作方法总结
一.TP5数据库操作方法 1.name()方法 作用 : 指定默认的数据表名(不含前缀) 示例 : Db::name('weiba_post'); 返回 : ...
- 爬虫之Scarpy.Request
一 .Request 1.request Scarpy中的HTTP请求对象 1.1.Requse的构造 #我们ctrl+左键可以看到Scarpy.Request的代码 class Request(ob ...
- django之路由分发
路由分发决定哪一个路由由哪一个视图函数来处理. 注意:django2.0里的re_path和django1.0里的url除了名字不一样,其他都一样. 简单配置 from django.urls imp ...
- django之配置静态文件
# 别名 STATIC_URL = '/static/' # 配置静态文件,名字必须是STATICFILES_DIRS STATICFILES_DIRS = [ os.path.join(BASE_D ...