Django教程 —— 模型类条件查询
引言
在之前的 Django模型设计 中简单的介绍了如何利用模型类对数据库进行增删改查,在这篇中主要介绍使用模型类对数据库进行条件查询。让大家更加熟悉
Django
操作数据库。
环境
环境名称 | 版本 |
---|---|
Python | 3.7.9 |
Django | 3.1.2 |
MySql-Server | 5.7.32 |
PyMySQL | 0.10.1 |
数据库表:
以如下数据表数据进行测试:
id | title | author | pub_date | read | comment |
---|---|---|---|---|---|
1 | 天龙八部 | 金庸 | 1967-10-17 | 5000 | 3000 |
2 | 射雕英雄传 | 金庸 | 1969-03-17 | 8000 | 5000 |
3 | 神雕侠侣 | 金庸 | 1959-10-17 | 6000 | 8000 |
4 | 三少爷的剑 | 古龙 | 1977-08-01 | 3000 | 1000 |
5 | 笑傲江湖 | 金庸 | 1969-03-17 | 7000 | 9000 |
字段查询
实现 sql
中 where
的功能,调用过滤器 filter()
、exclude()
、get()
,下面以filter()
为例。
通过 属性名_id
表示外键对应对象的 id
值。
语法如下:
属性名称__比较运算符=值
说明:属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。
1) 查询等
exact:表示判等。
例:查询编号为1的图书。
book = BookInfo.objects.filter(id__exact=1)
可简写为:
book = BookInfo.objects.filter(id=1)
2) 模糊查询
contains:是否包含。
说明:如果要包含%无需转义,直接写即可。
例:查询书名包含 传
的图书。
books = BookInfo.objects.filter(title__contains='传')
startswith、endswith:以指定值开头或结尾。
例:查询书名以’部’结尾的图书
books = BookInfo.objects.filter(title__endswith='部')
以上运算符都区分大小写,在这些运算符前加上
i
表示不区分大小写如 iexact、icontains、istartswith、iendswith.
3) 空查询
isnull:是否为null。
例:查询书名不为空的图书。
books = BookInfo.objects.filter(title__isnull=False)
4) 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书
books = BookInfo.objects.filter(id__in=[1, 3, 5])
5) 比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于。
名称 | 全称 | 含义 |
---|---|---|
gt | greater than | 大于 |
gte | greater than equal | 大于等于 |
lt | less than | 小于 |
lte | less than | 小于等于 |
全称更方便理解记忆。
例:查询编号大于3的图书
books = BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
books = BookInfo.objects.exclude(id=3)
6) 日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1969年发表的图书。
books = BookInfo.objects.filter(pub_date__year=1969)
例:查询1960年1月1日后发表的图书。
books = BookInfo.objects.filter(pub_date__gt=date(1960, 1, 1))
F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?
答:使用 F对象
,被定义在 django.db.models
中。
语法如下:
F(属性名)
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
...
books = BookInfo.objects.filter(read__gte=F('comment'))
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书。
books = BookInfo.objects.filter(read__gt=F('comment') * 2)
Q对象
多个过滤器逐个调用表示逻辑与关系,同 sql语句
中 where
部分的 and
关键字。
例:查询阅读量大于20,并且编号小于3的图书。
books = BookInfo.objects.filter(read__gt=20, id__lt=3)
或
books = BookInfo.objects.filter(read__gt=20).filter(id__lt=3)
如果需要实现 逻辑或or
的查询,需要使用 Q对象
结合 |
运算符,Q对象
被定义在 django.db.models
中。
语法如下:
Q(属性名__运算符=值)
例:查询阅读量大于5000的图书,改写为Q对象如下。
from django.db.models import Q
...
books = BookInfo.objects.filter(read__gt=5000)
改写成Q对象
books = BookInfo.objects.filter(Q(read__gt=5000))
Q对象
可以使用 &
、|
连接,&
表示逻辑与,|
表示逻辑或。
例:查询阅读量大于5000,或编号小于3的图书,只能使用Q对象实现
books = BookInfo.objects.filter(Q(read__gt=5000) | Q(pk__lt=3))
Q对象前可以使用 ~
操作符,表示非、not
。
例:查询编号不等于3的图书。
books = BookInfo.objects.filter(~Q(pk=3))
注意:pk,全称 primary key 代表主键 id
聚合函数
使用 aggregate()
过滤器调用聚合函数。聚合函数包括:Avg、Count、Max、Min、Sum
,被定义在django.db.models
中。
例:查询图书的总阅读量。
from django.db.models import Sum
...
books = BookInfo.objects.aggregate(Sum('read'))
注意:aggregate 的返回值是一个字典类型,格式如下:
{'聚合类小写__属性名':值}如:
{'sum__read': 29000}
使用 count
时一般不使用 aggregate()
过滤器。
例:查询图书总数。
books = BookInfo.objects.count()
注意:count函数的返回值是一个数字。
公众号
新建文件夹X
大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
Django教程 —— 模型类条件查询相关推荐
- Django框架(14.Django中模型类的关系,以及模型类关联查询)
Django中模型类的关系,以及模型类关联查询 1.模型类关系 1.1 一对多关系 1.2多对多关系 1.3 一对一关系 1.4 一对多举例: 1.5 多对多举例: 1.6 一对一举例: 2.关联查询 ...
- Django开发实战2-5 模型- 基础条件查询
Django开发实战2-5 模型-基础条件查询 一.基本查询 1.使用FilmInfo/PeopleInfo.objects.get() 查询fid=2的 数据 2.使用FilmInfo/People ...
- python学习第6天---django框架---模型类及数据库操作
python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...
- django定义模型类-14
目录 1. 定义 字段类型 约束类型 django的模型类定义在应用下的 models.py 文件中. 模型类继承自 django.db.models 包下的 Model 类. 新创建应用 book ...
- Django框架(3.django设计模型类、模型类生成表、ORM框架简介)
ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...
- php ci model条件查询,Laravel关系模型指定条件查询方法
对于关系模型来说,有时候我们需要甄别关联后结果,例如,班级和学生是一对多关联,我现在查询班级,但是想只显示正常状态,即状态为1的学生,因为有的学生从这个班级里面删除了,状态是4,那么我们在查询的时候就 ...
- 在Django当中模型类中的choices怎么切换到其他字段
在Django当中模型类中的choices怎么切换到其他字段 choices的使用 choices在模型类当中是一个非常常见的字段,它可以让我们的字段更好的理解可以进行切换是非常的方便,利用这样的方法 ...
- Django框架(12.Django中模型类高阶查询(Q对象以及F对象 和聚合函数查询))
Q对象 作用:用于查询时条件之间的逻辑关系.not and or,可以对Q对象进行 & | ~ 操作. & : 且 | : 或 ~ :非: 就 ...
- Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)
文章目录 1.查询函数 2.F对象 3.Q对象 4.聚合函数 5.Count函数 6.查询集 查询集的特性 对查询集进行切片 判断一个查询集中是否有数据 7.模型类之间的关系 一对多关系 多对多关系 ...
最新文章
- 前端运行python代码几种方式_前的解释|前的意思|汉典“前”字的基本解释
- Matlab 条形图实例
- VTK:可视化之RenderTranslucentGeometry
- linux exit 源码,Linux命令——exit、sulogin、rlogin
- OC --(5)-- 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序...
- hadoop碰到的 一个问题
- [深度学习-优化]欠拟合与过拟合以及解决方法
- C语言图像处理二值图细化,Visual C 实现二值图像处理
- java预科_java复习预科知识-Markdown学习
- ideal如何用标签输出_实战|如何使用JavaScript访问设备前后摄像头
- 一维码,二维码,com.google.zxing
- 学校计算机考证要交费吗,大家好,请问技校考证要交几百元费用是否可以?
- reStructuredText 表格快速生成
- S32K144(12)FTM
- 王者荣耀: 史上最长对局, 无法打破的神话英雄, 10小时4千人头
- 编程中常见的各种符号英文名字
- Java实现 洛谷 P1064 金明的预算方案
- 2.1.4 超声波雷达
- 【Linux】Samba服务器超详细安装、配置(附带各种问题解决方式)
- 关于RTT、TTL、MSL的概念解释