django学习笔记--数据库中的多表操作
1.Django数据库----多表的新增操作
1.一对一模式下新增
创建一个详情对象,把这个对象赋值给创建的新的user对象
author_detail = models.AuthorDetail.objects.create(addr='上海',phone='178****4789')
# 直接设置author_detail为一个对象
author = models.Author.objects.create(name="zhangsan",age=32,author_detail=author_detail)
# 直接设置author_detail_id,或者直接设置她的主键为对应的id,author_detail.pk
author = models.Author.objects.create(name="李四",age=40,author_detail_id=author_detail.pk)
1.1.删除和修改,直接修改更新
author = models.Author.objects.filter(pk=1).update(author_detail_id=3)
2.一对多的添加
publish = models.Publish.objects.create(name='上海出版社',addr='上海东方明珠',phone='138****9087',email='***080977**@qq.com')
book = models.Book.objects.create(name='红楼梦',price=120.00,publish_date='2018-09-10',publish=publish)
3.多对多关系
# 给书添加两个作者
book = models.Book.objects.filter(name='红楼梦').first()
# 拿到数据模型,add可以传对象也可以传id
book.authors.add(1,3)
# 删除书的两个作者
# clear 移除所有的作者
book.authors.clear()
# remove 移除一个对象,可以传对象或者id
book.authors.remove(3)# 修改对象
# 第一种方式 全部删除,在重新添加
# 第二种方式 set 参数必须是列表,列表内可以传id或者对象
book.authors.set([7,1])
4.基于对象的跨表查询
4.1 跨表查询分为正向和反向,
1.正向---> 关联字段在当前表中,从当前表向外查,叫正向
2.反向---> 关联字段不在当前表中,从当前表向外查,叫反向
4.2 一对一查询,正向查询按字段,反向查询按表名小写
1.正向查询按字段
2.反向查询按表名小写
#正向 ,查询name为张三的人的居住地址
author = models.Author.objects.filter(name='张三').first()
print(author.author_detail.addr)
#反向 查询居住地址为上海的人的名称
author_detail = models.AuthorDetail.objects.filter(addr="上海").first()
print(author_detail.author.name)# 查询红楼梦的出版社地址
book = models.Book.objects.filter(name='红楼梦').first()
print(book.publish.addr)
4.3 一对多查询
1.正向查询按字段
2.反向查询按表名小写_set
#北京出版社出版的所有书籍
publish = model.Publish.objects.filter(name='北京出版社').first()
#books获取到的是一个querySet对象
books = publish.book_set.all()#查询红楼梦的所有作者
book = models.Book.objects.filter(name='红楼梦').first()
authors = book.authors.all()
4.4 多对多查询
1.正向查询按字段
2.反向查询按表名小写_set
#查询张三所写的所有书
author = models.Author.objects.filter(name='张三').first()
print(author.book.set.all()).first())
5.基于对象的跨表查询是子查询,基于双下划线的查询是连表查询
正向按字段 反向按表名小写,跨表查询,通过一张表获取多个表对应的数据
#一对一查询 跨表查询
#查询张三的个人地址
addr = models.Author.objects.filter(name='张三').values('name','author_detail__addr').first()
res = models.AuthorDetail.objects.filter(author__name="张三").values('addr',author__name)#查询地址为上海的人的名字 反向查询
res = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail_addr').first()
#正向查询
res = models.AuthorDetail.objects.filter(addr='上海').values('addr','author__name').first()# 一对多查询
# 查询红楼梦的出版地址
res = models.Publish.objects.filter(book__name='红楼梦').values('name','book__name').first()#查询北京出版社出版的书
res = models.Book.objects.filter(publish__name='北京出版社').values('name','publish__name').first()# 多对多查询
# 跨表查询,Publish Book Authors 三张表查询
# 查询北京出版社出版过的所有书籍的名字以及作者的名字
# book__ 在book这个表中book__authors在authors表中
# res = models.Publish.objects.filter(name="北京出版社").values("book__name",'book__authors__name').first()
# print(res)
# res = models.Book.objects.filter(publish__name="北京出版社").values('name','authors__name').first()
# print(res)
# res = models.Author.objects.filter(book__publish__name="北京出版社").values('name','book__name')
# print(res)
6.F和Q 聚合查询和分组查询
引入对应的模块,aggregate聚合函数
# from django.db.models import Count,Avg,Max,Min,Sum
# 获取图书价格的各种信息
# ret = models.Book.objects.all().aggregate(Avg('price'))
# ret = models.Book.objects.all().aggregate(Max('price'))
# ret = models.Book.objects.all().aggregate(Min('price'))
# ret = models.Book.objects.all().aggregate(Count('price'))
# ret = models.Book.objects.all().aggregate(Sum('price'))
6.1 F和Q查询
1.F取出表中字段对应的值
2.Q查询的时候构成与或非的关系
在book里面添加评论数和阅读数
# from django.db.models import F,Q
# 查询评论数大于阅读数的书
res = models.Book.objects.filter(commit_num__lt=F('read_num'))
# 所有评论数加1
ret = models.Book.objects.all().update(commit_num=F("commit_num")+1)# Q构造查询关系
# 查询名字为红楼梦的书并且价格为20的书
ret = models.Book.objects.filter(name='红楼梦',price=20)
ret = models.Book.objects.filter(Q(name='红楼梦')&Q(price=20))
# 查询名字为红楼梦的书或价格为20的书
ret = models.Book.objects.filter(Q(name='红楼梦')|Q(price=20))
# 查询名字不等于红楼梦 取非
ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20.0)
转载于:https://www.cnblogs.com/zj901203/p/10967836.html
django学习笔记--数据库中的多表操作相关推荐
- Django 学习 之ORM简介与单表操作
一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...
- .NET学习笔记:文件和注册表操作
数据流:所有流式类的(抽象)基类都是System.IO命名空间下的Stream类.Stream类允许通过文件.网络.套接字流动数据.我们可以使加密的数据流动,也可以使数据流缓冲处理. 通过缓冲流动数据 ...
- 用ajax做级联操作,学习笔记之MVC级联及Ajax操作
由于刚转型到MVC,MVC的架构模式很多不是很清楚,比如今天就想做个级联的操作,因为之前的ASP.NET的方式是通过:控件-->添加事件-->后台编写级联事件进行触发,但是这个MVC就不同 ...
- Mysql数据库学习笔记(1.创建数据表)ubuntu18.04
*创建数据表 用户名:root 密码: 连接数据库:mysql -u root -p 退出数据库:quit; exit; ctrl+D *远程连接 mysql -hip地址 -uroot -p -h ...
- django 学习笔记
django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...
- django学习笔记02
原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...
- django学习笔记01
原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...
- 千锋Django学习笔记
千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...
- oracle 表导出pdm文件,如何将数据库中已有表导入到powerDesigner生成pdm文件
1.create new PDM: 2.select database menu; 3.click Reverse Engineer database : 4.then choose your sc ...
最新文章
- PL/SQL常用方法汇总
- LNMP下目录访问验证
- (22)通过代码修改PTE实现挂物理页
- [SpringBoot2]welcomefavicon
- Ionic混合移动app框架学习
- 红橙Darren视频笔记 缓存方案 缓存到数据库(数据库操作) 上
- 怎么用Excel来批量生成SQL语句
- ESTORE OPENCART 清爽现代主题模板 ABC-0063
- jQuery源码解析(30)
- 小票打印机安装配置全过程 58mm热敏票据打印机驱动安装
- PADS(4)——PADS Logic原理图设计技巧
- 高德地图自定义定位当前位置按钮
- linux光盘属于什么设备,Linux系统中,光盘的设备文件为
- 手机就能申请摇号 杭州市小客车摇号功能全新上线
- C#获取北京时间多种方法
- 阿里云Oss水印图片处理Utils
- 2022-09-12 mysql语法分析实现
- 开启ICT宝藏之门——CloudOpera IES 创新社区正式成立
- 广告主流量主怎么申请(微信)
- 【ct107d】开发版说明书
热门文章
- spring 测试类test测试方法
- 数据结构之跳表Skiplist
- HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)
- VBScript中InStr函数的用法
- hdu 4263(有限制的生成树)
- 社会生活中常用的14条著名法则
- vlookup示例_VLOOKUP示例–如何在Excel中执行VLOOKUP
- uber_Uber是如何制成的
- php类方法语法错误捕获,php语法错误捕获
- 验证(verification)和确认(validation)