引言

在之前的 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

字段查询

实现 sqlwhere 的功能,调用过滤器 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教程 —— 模型类条件查询相关推荐

  1. Django框架(14.Django中模型类的关系,以及模型类关联查询)

    Django中模型类的关系,以及模型类关联查询 1.模型类关系 1.1 一对多关系 1.2多对多关系 1.3 一对一关系 1.4 一对多举例: 1.5 多对多举例: 1.6 一对一举例: 2.关联查询 ...

  2. Django开发实战2-5 模型- 基础条件查询

    Django开发实战2-5 模型-基础条件查询 一.基本查询 1.使用FilmInfo/PeopleInfo.objects.get() 查询fid=2的 数据 2.使用FilmInfo/People ...

  3. python学习第6天---django框架---模型类及数据库操作

    python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...

  4. django定义模型类-14

    目录 1. 定义 字段类型 约束类型 django的模型类定义在应用下的 models.py 文件中. 模型类继承自 django.db.models 包下的 Model 类. 新创建应用 book ...

  5. Django框架(3.django设计模型类、模型类生成表、ORM框架简介)

    ORM框架简介 O是object,也就类对象的意思, R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思, M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进 ...

  6. php ci model条件查询,Laravel关系模型指定条件查询方法

    对于关系模型来说,有时候我们需要甄别关联后结果,例如,班级和学生是一对多关联,我现在查询班级,但是想只显示正常状态,即状态为1的学生,因为有的学生从这个班级里面删除了,状态是4,那么我们在查询的时候就 ...

  7. 在Django当中模型类中的choices怎么切换到其他字段

    在Django当中模型类中的choices怎么切换到其他字段 choices的使用 choices在模型类当中是一个非常常见的字段,它可以让我们的字段更好的理解可以进行切换是非常的方便,利用这样的方法 ...

  8. Django框架(12.Django中模型类高阶查询(Q对象以及F对象 和聚合函数查询))

    Q对象 作用:用于查询时条件之间的逻辑关系.not and or,可以对Q对象进行  &  |  ~  操作. & : 且        | :  或          ~ :非: 就 ...

  9. Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)

    文章目录 1.查询函数 2.F对象 3.Q对象 4.聚合函数 5.Count函数 6.查询集 查询集的特性 对查询集进行切片 判断一个查询集中是否有数据 7.模型类之间的关系 一对多关系 多对多关系 ...

最新文章

  1. 前端运行python代码几种方式_前的解释|前的意思|汉典“前”字的基本解释
  2. Matlab 条形图实例
  3. VTK:可视化之RenderTranslucentGeometry
  4. linux exit 源码,Linux命令——exit、sulogin、rlogin
  5. OC --(5)-- 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序...
  6. hadoop碰到的 一个问题
  7. [深度学习-优化]欠拟合与过拟合以及解决方法
  8. C语言图像处理二值图细化,Visual C 实现二值图像处理
  9. java预科_java复习预科知识-Markdown学习
  10. ideal如何用标签输出_实战|如何使用JavaScript访问设备前后摄像头
  11. 一维码,二维码,com.google.zxing
  12. 学校计算机考证要交费吗,大家好,请问技校考证要交几百元费用是否可以?
  13. reStructuredText 表格快速生成
  14. S32K144(12)FTM
  15. 王者荣耀: 史上最长对局, 无法打破的神话英雄, 10小时4千人头
  16. 编程中常见的各种符号英文名字
  17. Java实现 洛谷 P1064 金明的预算方案
  18. 2.1.4 超声波雷达
  19. 【Linux】Samba服务器超详细安装、配置(附带各种问题解决方式)
  20. 关于RTT、TTL、MSL的概念解释

热门文章

  1. Gecco学习笔记(三)
  2. 终极单词index 排序 W-Y-Z
  3. 让我们一起详细了解一下卷积神经网络CNN
  4. 学科认知实践报告——我对未来所学专业(计科)的认知
  5. 【Java校招面试】实战算法(五)——分数相加(虎牙)
  6. NVIDIA V100 GPU 性能测试数据
  7. 咸鱼前端—HTML标签难点整理1
  8. 恭喜!1024博客专家TOP 50榜单出炉!
  9. 跨境电商:利用Tiktok做Facebook广告
  10. word文档将单词表中单词挖空