基于双下划线查询

根据存的时候,字段的数据格式衍生的查询方法

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多表查询的更多相关文章

  1. Django ORM多表查询练习

    ORM多表查询 创建表结构: from django.db import models # 创建表结构 # Create your models here. class Class_grade(mod ...

  2. django ORM 连表查询2

    set() 更新model对象的关联对象 book_obj=models.Book.objects.first() book_obj.authors.set([2,3]) 把book_obj这个对象重 ...

  3. django ORM 连表查询

    db_index=True  如果设置该字段就可以设置索引 auto_now_add  代表设置创建时候的时间 auto_now   每次更新数据记录时会更新该字段 to_field 设置要关联表的字 ...

  4. Django ORM单表查询必会13条

    必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...

  5. django orm跨表查询废话最少最精简版

    在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...

  6. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  7. 第五章、Django之多表查询进阶与事务

    目录 第五章.Django之多表查询 一.聚合查询 二.分组查询 三.F与Q查询 四.查询优化 五.Django开启事务 六.自定义char字段 七.ORM常用字段 第五章.Django之多表查询 一 ...

  8. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  9. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

随机推荐

  1. javax.naming.NoInitialContextException:Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial

    小弟初次用JNDI,使用数据源连接数据库,配置完相关的xml文件后,激动的我赶紧测试了一下,结果悲剧了,报出了错误: javax.naming.NoInitialContextException:Ne ...

  2. Vue.js 作用域、slot用法(单个slot、具名slot)

    作用域 在介绍slot前,需要先知道一个概念:编译的作用域.比如父组件中有如下模板: <child-component> {{message}} <child-component&g ...

  3. 文末送书四本 | 这篇Java反射机制太经典!不看后悔!

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...

  4. 使用 Java 和 Maven (JBake) 生成静态网站

    使用 JBake("mvn generate-resources")构建您的静态网站或博客.使用布局.宏和数据文件. 我们迁移了整个www.optaplanner.org网站(13 ...

  5. UI自动化测试框架Gauge 碰到无法识别Undefined Steps 红色波纹标记

    如果碰到无法识别的情况,例如下面的红色波纹,可以试一下: 第一步: 第二步: 不勾选'offline work' 第三部:刷新之后可以重新编译.

  6. nginx+waf防火墙

    1.官网下载nginx源码包(nginx-1.20.0.tar.gz) 新建nginx安装目录​mkdir -p /opt/nginx​新增nginx运行用户​useradd -s /sbin/nol ...

  7. [刘阳Java]_Spring对Dao的支持_第10讲

    Spring框架优秀就是在于MVC开发的时候一旦需要对底层的数据库操作,它可以很好的支持JDBC技术,还有现在主流的ORM框架(Hibernate, MyBatis)技术. 重点先介绍Spring对J ...

  8. Redis学习——简介

    一.Redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表). ...

  9. Linux 安装exclipse

    1,在官网下载:https://www.eclipse.org/downloads/packages/ 2,前提:安装好jdk 3,使用命令解压:tar -zxvf eclipse_xxxxxx.ta ...

  10. airodump-ng的使用及显示

    PWR   表示所接收的信号的强度.表示为负数,数值赿大表示信号赿强.(绝对值赿大,数据赿值小) beacons  表示网卡接收到的AP发出的信号个数