orm多表操作
一.创建表
1.一对多
必须在"多"的表中创建关联字段,在外加约束
class Book(models.Model):
id=models.AotuField(primary_key=True)
title=models.CharField(max_length=32)
publish=models.ForeignKey(to='Publish',on_delete=models.CASCADE) 注:正常为字段起名即可,Django会默认为外键属性拼接_id,以此作为表的字段
to对应的是关联的表
2.一对一
可以在任意表中创建关键字段,Django默认为其加上唯一约束
class Author(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=32)
ad=models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
3.多对多
class Book(models.Model):
id=models.AotuField(primary_key=True)
title=models.CharField(max_length=32)
authors=models.ManyToMany(to='Author') 注:Django对默认为其创建第三张表
第三张表的表名为:此表表名(小写)_创建多对多的字段
第三张表的字段为 id,此表表名_id,关联表表名_id
注:用Django创建表时,不加id字段会被默认添加
外键字段有一个null=True的设置,表示允许外键为空值
二.对表记录的操作
1.填加表记录
(1)一对多
方式1:
Book.objects.create(title='王八蛋啥时候来',pub_date='2012-12-12',price=12,publish_id=1)
此处的1代表'一'表中的主键值为1
方式2:
publish_obj=publish.objects.get(id=1)
Book.objects.create(title='王八蛋啥时候来',pub_date='2012-12-12',price=12,publish=publish_obj)
注:如果直接用数字,要用表的字段值 publish_id
如果用'一'表对象,要用类的属性 publish
(2)多对多
a.生成书籍对象
book_obj=Book.objects.create(title='王八蛋啥时候来',pub_date='2012-12-12',price=12,publish_id=1)
b.为书籍对象绑定作者
shy=Author.objects.filter(name='shy').first()
jwb=Author.objects.filter(name='jwb').first()
c.向关系表book_authors中添加纪录
方式1:book_obj.authors.add(shy,jwb)
方式2:book_obj.authors.add(1,2)
方式3:book_obj.authors.add(*[1,2]) 其他方法:
book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 (book_obj.authors.remove(*[]))
book_obj.authors.clear() #清空被关联对象集合
book_obj.authors.set() #先清空再设置
2.查询表记录
注:正向查询与反向查询
正向查询:关联属性所在的表查询关联表记录
反向查询:关联表查询关联属性所在的表记录
(1)基于对象的跨表查询
一对多
正向查询按字段:book.publish
Book----------------------------------------->Publish
反向查询按表名小写+_set.all():publish.book_set.all() 正向查询例:查询python这本书出版社的名字和邮箱
book_obj=Book.objects.filter(title='python').first()
publish_obj=Publish.objects.filter(id=book_obj.publish).first().values('name','email')
反向查询例:查询人民出版社出版的所有书籍的名称
publish_obj=Publish.objects.filter(name='人民出版社').first()
print(publish_obj.book_set.all())
多对多
正向查询按字段:book.authors.all()
Book----------------------------------------->Publish
反向查询按表名小写+_set.all():author.book_set.all()
正向查询例:查询python这本书作者的名字
book_obj=Book.objects.filter(title='python').first()
print(book_obj.authors.all().values('name'))
反向查询例:查询shy出版过的所有书籍的名称
author_obj=Author.objects.filter(name='shy').first()
print(author_obj.book_set.all().values('title'))
一对一
正向查询按字段:author.ad
Book---------------------------------------->Publish
反向查询按表名小写:authordetail.author
正向查询例:查询shy的手机号
author_obj=Author.objects.filter(name='shy').first()
print(author_obj.ad.tel)
反向查询例:查询地址为北京的作者
authordetail_obj=AuthorDetail.objects.filter(addr='北京')
print(authordetail_obj.author)
(2)基于双下划线的跨表查询
基于双下划线的单次跨表查询
语法:正向查询按字段,反向查询按表名小写 一对多查询
正向查询例:查询本草纲目这本书出版社的名字
Book.objects.filter(title='本草纲目').values('publish__name')
正向查询例:查询北京出版社出版的所有书籍的名称与价格
Publish.objects.filter(name='北京出版社').values('book__title','book__price') 多对多查询
正向查询例:查询皇帝的新装这本书的作者和年龄
Book.objects.filter(title='皇帝的新装').values('authors__age')
反向查询例:查询尚宏运出版过的所有书籍的名字
Author.objects.filter(name='尚宏运').values('book__title') 一对一查询
正向查询例:查询尚宏运的手机号
Author.objects.filter(name='尚宏运').values('ad__tel')
反向查询例:查询手机号为123456的作者
AuthorDetail.objects.filter(author__name='尚宏运').values('tel')
基于双下划线的连续跨表查询:
例查询北京出版社出版过的所有书籍的名字及作者的名字
方式1:
Publish.objects.filter(name='北京出版社').values('book__title','book__authors__name')
方式2;
Book.objects.filter(publish__name='北京出版社').values('title','authors__name')
方式3:
Author.objects.filter(book__publish__name='北京出版社').values('book__title','name')
(3)聚合和分组查询
聚合:
注:使用聚合函数前先引入
from django.db.models import Avg,Max,Sum,Min,Count
例:查询所有书籍的平均价格
Book.objects.all().aggregate(avg_price=Avg('price'))
分组:
语法:annotate()前values哪个字段,就用哪个字段进行分组,在annotate后的括号中使用聚合函数 单表分组查询
例:查询每一个部门对应员工的平均薪水
Emp.obj.values('dep').annotate(Avg('salary'))
跨表分组查询
例:查询每一个出版社的名称以及出版的书的平均价格
Publish.objects.values('name').annotate(Avg('book__price'))
简便写法:
例:查询每一个出版社的名称,以及对应书籍的平均价格
方式1:
Publish.objects.values('name').annotate(avg_price=Avg('book__price'))
方式2:
Publish.objects.all().annotate(avg_price=Avg('book__price')).values('name','avg_price')
方式3:
Publish.objects.annotate(avg_price=Avg('book__price')).values('name','avg_price')
注:使用聚合函数时,最好另起别名
(4)F与Q查询
注:使用F和Q查询前需要先引入
from django.db.models import F,Q
F查询
例:查询评论数大于点赞数的所有书籍的名称
Book.objects.filter(comment_count__gt=F('poll_count')).values('title')
给每一本书的价格提升100
Book.objects.all().values(price=F('price')+100)
Q查询
当查询的条件中存在与(&)或(|)非(~)时,使用Q查询
例:查询价格大于300或评论数大于3000的书籍
Book.objects.filter(Q(price__gt=300)|Q(comment__count__gt=3000))
查询价格大于100,或者不是尚宏运写的书
Book.objects.filter(Q(price__gt=100)|~Q(authors__name='尚宏运')).values('title')
orm多表操作的更多相关文章
- day59——orm单表操作
		day59 orm单表操作 对象关系映射(object relational mapping) orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执 ... 
- 17-2 orm单表操作和多表操作
		参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一 ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ... 
- Django框架06 /orm多表操作
		Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ... 
- Django框架05 /orm单表操作
		Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ... 
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
		目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ... 
- Django ORM 多表操作
		目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ... 
- python——Django(ORM连表操作)
		千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ... 
- Django ORM多表操作
		多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ... 
- ORM  多表操作查询及增删改查
		------------------------------------------只有对前途乐观的人,才能不怕黑暗,才能有力量去创造光明.乐观不是目的,而是人生旅途中的一种态度. 多表操作 创建模型 ... 
- 09 ORM 多表操作,创建表,添加记录
		1.数据库表关系 1.一对多 为什么需要,重复字段太多 一对多关系表 Book id title price publish_id 1 python 100 1 2 php 200 2 3 go 10 ... 
随机推荐
- Android高度仿新浪微博引导页面
			在写这一篇文章之前,先向大家推荐一篇博文:http://blog.csdn.net/dawanganban/article/details/17297671 感谢这位博主,我在该博主的基础上完成了对新 ... 
- dot net core 使用 usb
			原文:dot net core 使用 usb 本文告诉大家如何在 dot net core 使用 usb 目录 获得通知 读写 串口通信 LGPL 首先需要打开 Nuget 安装 CoreCompat ... 
- Delphi 获取外部程序句柄与发送消息
			--记录下来备以后用 [打开外部程序.消息.句柄],技术有限,希望不要误人子弟了. 源码unit Unit1; interface uses Windows, Messages, SysUtils, ... 
- 用C++写android程序(包含界面+发短信)
			首先为什么要用C++写android程序呢?主要是因为java写的android程序太容易被发编译,相对于java编译后的dex文件,底层的native so更加不容易被反编译,所以为了安全起见,可以 ... 
- 在.net core项目中想使用类似iis上面虚拟目录的功能
			事实上iis是不支持.net core mvc项目虚拟目录的.你在iis上发布网站 然后在wwwroot目录上创建虚拟目录,指向硬盘其他位置上的文件夹,是不会有效果的. 正确的处理方式应该是修改静态文 ... 
- Theano 编程核心
			1. 求偏导.更新以及模型的训练 以 LogisticRegression 为例: 求损失函数关于参数的偏导: import theano.tensor as T g_W = T.gradient(c ... 
- 使用devcpp在windowXP上qt4.4.3安装与使用入门
			1.安装前先安装devcpp,我下载的是devcpp-4.9.9.2_setup.exe2.安装qt4.4.3,下载的是qt-win-opensource-4.4.3-mingw.rar,解压后运行后 ... 
- 2017 JavaScript 开发者的学习图谱
			码云项目推荐 前端框架类 1.项目名称: 基于 Vue.js 的 UI 组件库 iView 项目简介:iView 是一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品. 特性 ... 
- 静态资源(StaticResource)和动态资源(DynamicResource)
			一.文章概述 本演示介绍了WPF的静态资源和动态资源的基本使用,并对两者做了简单的比较. 二.定义并使用资源 <Window x:Class="Demo010.MainWindow&q ... 
- SignalR QuickStart
			原文:SignalR QuickStart SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限 ... 
