Django ORM多表查询
基于双下划线查询
根据存的时候,字段的数据格式衍生的查询方法
1、年龄大于35岁
res = models.AuthorDetails.objects.filter(age__lt=80)
print(res)
# 输出结果 <QuerySet [<AuthorDetails: yuhua@dd>, <AuthorDetails: cao@di.com>, <AuthorDetails: gao@doi.com>]>
2、年龄小于35岁
res = models.AuthorDetails.objects.filter(age__gt=80)
print(res)
# 输出结果 <QuerySet [<AuthorDetails: jinyong@qr.com>]>
# 大于等于 小于等于
# res = models.User.objects.filter(age__gte=32)
# print(res)
# res = models.User.objects.filter(age__lte=32)
# print(res)
3、年龄等于48或者32
res = models.AuthorDetails.objects.filter(age__in=[48, 32]) # 表示or关系 列表括起来
print(res)
# 输出结果 <QuerySet [<AuthorDetails: cao@di.com>, <AuthorDetails: gao@doi.com>]>
4、年龄在48或者56岁之间的
res = models.AuthorDetails.objects.filter(age__range=[32, 56]) # 这里的range是包括头和尾的
print(res)
<QuerySet [<AuthorDetails: yuhua@dd>, <AuthorDetails: cao@di.com>, <AuthorDetails: gao@doi.com>]>
5、查询名字里面含有g的数据 模糊查询
# where name like '%i%'
res = models.Author.objects.filter(name__contains='i')
# 对应SQL语句 'contains': 'LIKE BINARY %i%' 其中的BINARY是精确大小写
res = models.Author.objects.filter(name__icontains='I')
# 'icontains': 'LIKE %s' 而’icontains’中的’i’表示忽略大小写
6、以查询名字以g结尾的
res = models.Author.objects.filter(name__endswith='g')
# 以g结尾的
res = models.Author.objects.filter(name__startswith='y')
# 以y开头的
7、导出9月份数据(重要)
res = models.User.objects.filter(create_time__month='04')
print(res)
# 这里需要注意的是时间字段不能设为DateTimeFiled否则是查不出来的
# 查询一年中某个月的数据
res = models.User.object.filter(create_time_month='04', create_time_year='2021')
一对多的增删改查
# 这里增加还是需要先建关联的那一张表
models.Book.objects.create(title='许三观卖血记', price=32.98, publish_id=2)
models.Book.objects.filter(pk=4).update(price=33.45)
# 删除的话会级联更新,级联删除。
book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish)
# 正向查询
多对多的增删改查
增
1.book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.add(3, 5)
# .author跳转到第三张表
2. author_obj = models.Author.objects.filter(pk=1).first()
book_obj = models.Book.objects.filter(pk=1).first()
book_obj.authors.add(author_obj)
改
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.set([3, 5])
# 这里的set方法要放列表,可迭代对象
删
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(3,3)
# 书id=3对应着的作者id=3的删除
clear可以清空数据
查
book_obj = models.Book.object.filter(pk=3).first()
print(book_obj.author.all())
# 当查询结果为多个的时候,要加.all()
# 当查询结果为一个的时候,不要加.all()
正反向的概念,为了更好的记忆
# 正向:比如外键字段在A表中,需要通过A表去查B表,那这个查询方向就是正向的
# 反向:比如外键字段在A表中,需要通过B表去查A表,那这个查询方向就是反向的
正向查询按字段查
反向查询按表名小写,或者表明小写_set.all()(有多个结果时)
聚合查询
使用聚合查询需要导入模块
from django.db.models import Max, Min, Sum, Count, Avg
聚合查询有一个关键字aggregate:
.aggregate(聚合函数名('字段名'))
1 所有书的平均价格 select avg(price) from book where id > 2
res = models.Book.objects.aggregate(Avg('price'))
"""
聚合查询需要加aggregate
分组查询需要加annotate
"""
print(res)
res = models.Book.objects.aggregate(avg=Avg('price'), price_max=Max('price'), price_min=Min('price'), sum=Sum('price'), count=Count('price'))
print(res)
分组查询
关键字annotate
# 1.统计每一本书的作者个数
res = models.Book.objects.annotate() # 默认就是按照models后面的表名分组
print(res)
res = models.Book.objects.annotate(count=Count('authors__pk')).values("title", 'count')
print(res)
# 2.统计每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(price_min=Min('book__price')).values('title', 'price_min')
# .values是为了更好的查看,返回一个可迭代的字典序列
print(res)
# <QuerySet [{'title': '雪山飞狐打折', 'price': Decimal('34.22'), 'publish': 3}]>
# 3.统计不止一个作者的图书
# 1) 先查询每一本书的作者个数,
# 2) 在筛选出大于1的
res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title', 'author_num')
print(res)
"""
res = models.Book.objects.values('').annotate
"""
Django ORM多表查询的更多相关文章
- Django ORM多表查询练习
ORM多表查询 创建表结构: from django.db import models # 创建表结构 # Create your models here. class Class_grade(mod ...
- django ORM 连表查询2
set() 更新model对象的关联对象 book_obj=models.Book.objects.first() book_obj.authors.set([2,3]) 把book_obj这个对象重 ...
- django ORM 连表查询
db_index=True 如果设置该字段就可以设置索引 auto_now_add 代表设置创建时候的时间 auto_now 每次更新数据记录时会更新该字段 to_field 设置要关联表的字 ...
- Django ORM单表查询必会13条
必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...
- django orm跨表查询废话最少最精简版
在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- 第五章、Django之多表查询进阶与事务
目录 第五章.Django之多表查询 一.聚合查询 二.分组查询 三.F与Q查询 四.查询优化 五.Django开启事务 六.自定义char字段 七.ORM常用字段 第五章.Django之多表查询 一 ...
- 第十七篇 ORM跨表查询和分组查询---二次剖析
ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...
- ORM单表查询,跨表查询,分组查询
ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...
随机推荐
- APP 抓包(应用层)
0x01 前言: app抓包是逆向协议的前提,也是一个爬虫工程师的基本要求,最近发现这块知识非常欠缺就抓紧补补了(我太菜了) 然后接下来是通过vpn将流量导出到抓包软件的方式,而不是通过wifi设置代 ...
- Linux 命令行通配符及转义符的实现
我们想对一类文件批量操作,例如批量查看硬盘文件属性,那么正常命令会是: [root@linuxprobe ~]# ls /dev/sda [root@linuxprobe ~]# ls /dev/sd ...
- lxml的使用(节点与xpath爬取数据)
lxml安装 lxml是python下功能很丰富的XML和HTML解析库,性能非常的好,是对libxml3和libxlst的封装.在Windows下载这个库直接使用 pip install lxml ...
- Window安装构建神器Jenkins
Jenkins是什么? Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.支持各种运行方式,可通过系统包.Docker 或者通过一个独立的 Java 程 ...
- P3312 数表
P3312 数表 题意 求出 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(\gcd(i,j))[\sigma(\gcd(i,j))\le a] \] 其中 \(\sigma\) ...
- 【洛谷P1318积水面积】最小生成树
我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...
- Beego和Vue的前后端分离跨域问题处理
VUE封装的请求头(注意请求头,跨域要用到) 路径 utils/mereq.js import request from '@/utils/request' import qs from 'qs' e ...
- Python开发篇——如何在Flask下编写JWT登录
首先,HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息)--每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求 ...
- 谷粒商城--分布式高级篇P102~P128
谷粒商城--分布式高级篇P102~P128 由于学习的时间也比较少,只有周六周末才有时间出来学习总结,所以一篇一篇慢慢更新吧,本次总结内容为Elasticsearch(相关内容:kibana,es,n ...
- SaltStack 命令注入漏洞(CVE-2020-16846)
SaltStack 是基于 Python 开发的一套C/S架构配置管理工具.2020年11月SaltStack官方披露了CVE-2020-16846和CVE-2020-25592两个漏洞,其中CVE- ...