ORM基础之字段及其参数介绍
一、外键ForeignKey
1、字段参数
1.to
设置要关联的表 2.to_field
设置要关联的表的字段(一般不设置,默认使用主键id关联) 3.related_name
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' 4.related_query_name
反向查询操作时,使用的连接前缀,用于替换表名 5.on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。 1.models.CASCADE
删除关联数据,与之关联的数据也删除(on_delete=models.CASCADE) 2.抛出异常(错误)
1.models.DO_NOTHING
删除关联数据,引发错误IntegrityError 2.models.PROTECT
删除关联数据,引发错误ProtectedError 3.models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) 4.models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) 5.models.SET
删除关联数据
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) 6.db_constraint
是否在数据库中创建外键约束,默认为True。
二、OneToOneField(一对一)
1、通常一对一字段用来扩展已有字段。(跟ForeignKey一样,生成的字段,默认会加上_id) 2、字段参数
1.to
设置要关联的表。 2.to_field
设置要关联的字段。 3.related_name
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' 4.on_delete
同ForeignKey字段。
三、ManyToManyField
1、用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。 2、字段参数
1.to
设置要关联的表 2.related_name
同ForeignKey字段(反向操作时,使用的字段名,用于代替原反向查询时的'表名_set') 3.related_query_name
同ForeignKey字段(反向查询操作时,使用的连接前缀,用于替换表名) 4.symmetrical
仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
class Person(models.Model):
name = models.CharField(max_length=16)
friends = models.ManyToManyField("self")
此时,person对象就没有person_set属性。 class Person(models.Model):
name = models.CharField(max_length=16)
friends = models.ManyToManyField("self", symmetrical=False)
此时,person对象现在就可以使用person_set属性进行反向查询。 5.through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。 6.through_fields
设置关联的字段。 7.db_table
默认创建第三张表时,数据库中表的名称。 3、多对多的三种创建方式
1. 自己建立第三张关系表,外键分别关联两个表
1. 优点
1. 可以扩充第三张关系标的字段
2. 缺点
1. 自己做连表查询
3. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12) # 1. 多对多第一种创建方式:自己创建第三张关系表
class Author2Book(models.Model):
id = models.AutoField(primary_key=True)
author_id = models.ForeignKey(to='Author')
book_id = models.ForeignKey(to='Book')
price = models.IntegerField() # 可以自己扩充需要的字段 2. 通过ORM内置的ManyToManyField,自动创建第三张关系表
1. 优点
1. 提供了很多连表操作的快捷方法--> all(), add(), set(), clear(), remove()
2. 缺点
1. 无法扩展第三张关系表
3. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12)
books = models.ManyToManyField(to='Book') # 字段就这些,无法扩充其他字段 3. 自己创建第三张关系表,通过ManyToManyField关联
1. 优点:
1. 既能够使用多对多查询的快捷方法all()(只能用all,不能使用add,set等),还能够自己扩展第三张关系表的字段
2. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12)
# 告诉ManyToManyField通过(through)Author2Book这张表进行关联,不使用ORM自动创建的第三张表,而是使用我自己创建的表
# through_fields告诉ORM通过哪几个字段进行多对多关联
books = models.ManyToManyField(to='Book', through='Author2Book', through_fields=('author', 'book')) # 1. 多对多第三种创建方式:自己创建第三张关系表,此时外键不需要添加_id了,因为ORM会默认帮你在外键后面加_id
class Author2Book(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(to='Author')
book = models.ForeignKey(to='Book')
price = models.IntegerField(null=True) # author_id和book_id要联合唯一
class Meta:
unique_together = (('author', 'book'),)
3. 操作例子
# 多对多的第三张方式也支持all查询
author_obj = Author.objects.first()
# 第一个作者的所有书籍
ret = author_obj.books.all() # 给第一个作者添加一本书
# author_obj.books.add(4) # 报错
Author2Book.objects.create(author_id=1, book_id=4)
四、元信息
1、ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下: 2、元类属性
1.db_table
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。 2.index_together
联合索引。 3.unique_together
联合唯一索引。 4.ordering
指定默认按什么字段排序。
只有设置了该属性,我们查询到的结果才可以被reverse()。
ORM基础之字段及其参数介绍的更多相关文章
- ORM基础2 字段及其参数和meta
		
一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...
 - day07 ORM中常用字段和参数
		
day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...
 - ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
		
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
 - Django ORM中常用字段和参数
		
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
 - Django --ORM常用的字段和参数 多对多创建形式
		
1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...
 - Django ORM常用的字段和参数
		
ORM 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类 ...
 - Django中ORM介绍和字段及其参数
		
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
 - Django中的ORM介绍,字段以及字段的参数。
		
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
 - django orm介绍以及字段和参数
		
Object Relational Mapping (ORM) orm介绍 orm概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数 ...
 
随机推荐
- WEB前端常见面试题汇总:(一)
			
1.JS找字符串中出现最多的字符 例如:求字符串'nininihaoa'中出现次数最多字符 方法一: var str = "nininihaoa"; var o = {}; for ...
 - Dynamics 365-为什么CRM环境Workflow执行了多次?
			
Workflow执行了多次,这个现象如果排除业务逻辑冲突,人为失误等原因,可能有的人遇到的并不多,但是笔者时不时还能遇到这种情况,所以在这里做个记录,也给遇到相同问题的人一个解决的方法. 当一个Wor ...
 - dns server 域名解析总结
			
1.客户有两种使用公网域名解析的方法,一种是,直接配置A记录,将域名直接解析到ip地址.第二种是,配置NS记录,将对这个域名的解析分配给另外一个域名服务器,这个域名服务器就是客户自己搭建的内部域名服务 ...
 - Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
			
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
 - Android远程桌面助手(Build 0737)
			
Android Remote Displayer and Controller Build 0737, Aug 02, 2017 新增功能: 录制MP4文件,突破了Android原生180S的限制 截 ...
 - 如何为 .NET Core CLI 启用 TAB 自动补全功能
			
如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...
 - redis 慢日志查询
			
Intro 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时. 长时间运行的命令的很少例子有 mget有大量的键,键*或写得不好的lua脚本. 可以运行通过 SlowLog 命令查 ...
 - Lua中string.format占位符的使用
			
虽然lua中字符串拼接"string.format"相对于".."消耗较大,但有时为了代码的可读性,项目中还是经常用到"string.format&q ...
 - 南邮攻防训练平台逆向maze
			
文件为 ELF64 可执行文件,输入正确 flag 返回判定结果的逆向题. 用 ida 打开,先看f5之后的代码,容易知道 flag 长度为24位,以 "nctf{" 为前缀: 先 ...
 - 2016 西普杯丶天津CTF预选赛(3/6)
			
哆啦A梦(图片隐写) 格式:SimCTF{ } 解:放到kail中binwalk一下(Binwalk是一个固件的分析工具,旨在协助研究人员对固件非分析,提取及逆向工程用处.简单易用,完全自动化脚本,并 ...