Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django教程 —— 模型类条件查询

Django教程 —— 模型类条件查询

作者头像
忆想不到的晖
发布于 2021-09-29 08:15:18
发布于 2021-09-29 08:15:18
1.2K00
代码可运行
举报
文章被收录于专栏:huihui
运行总次数:0
代码可运行

引言

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

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
属性名称__比较运算符=

说明:属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。

1) 查询等

exact:表示判等。

例:查询编号为1的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
book = BookInfo.objects.filter(id__exact=1)
可简写为:
book = BookInfo.objects.filter(id=1)

2) 模糊查询

contains:是否包含。

说明:如果要包含%无需转义,直接写即可。

例:查询书名包含 的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(title__contains='传')

startswith、endswith:以指定值开头或结尾。

例:查询书名以’部’结尾的图书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(title__endswith='部')

以上运算符都区分大小写,在这些运算符前加上 i 表示不区分大小写 如 iexact、icontains、istartswith、iendswith.

3) 空查询

isnull:是否为null。

例:查询书名不为空的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(title__isnull=False)

4) 范围查询

in:是否包含在范围内。

例:查询编号为1或3或5的图书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的图书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(id__gt=3)

不等于的运算符,使用exclude()过滤器。

例:查询编号不等于3的图书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.exclude(id=3)

6) 日期查询

year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

例:查询1969年发表的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(pub_date__year=1969)

例:查询1960年1月1日后发表的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(pub_date__gt=date(1960, 1, 1))

F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?

答:使用 F对象,被定义在 django.db.models 中。

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
F(属性名)

例:查询阅读量大于等于评论量的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db.models import F
...
books = BookInfo.objects.filter(read__gte=F('comment'))

可以在F对象上使用算数运算。

例:查询阅读量大于2倍评论量的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(read__gt=F('comment') * 2)

Q对象

多个过滤器逐个调用表示逻辑与关系,同 sql语句where 部分的 and 关键字。

例:查询阅读量大于20,并且编号小于3的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 中。

语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Q(属性名__运算符=)

例:查询阅读量大于5000的图书,改写为Q对象如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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对象实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(Q(read__gt=5000) | Q(pk__lt=3))

Q对象前可以使用 ~ 操作符,表示非、not

例:查询编号不等于3的图书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.filter(~Q(pk=3))

注意:pk,全称 primary key 代表主键 id

聚合函数

使用 aggregate() 过滤器调用聚合函数。聚合函数包括:Avg、Count、Max、Min、Sum,被定义在django.db.models 中。

例:查询图书的总阅读量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db.models import Sum
...
books = BookInfo.objects.aggregate(Sum('read'))

注意:aggregate 的返回值是一个字典类型,格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'聚合类小写__属性名':}
  :
{'sum__read': 29000}

使用 count 时一般不使用 aggregate() 过滤器。

例:查询图书总数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
books = BookInfo.objects.count()

注意:count函数的返回值是一个数字。

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith. 3) 空查询
愚公搬代码
2022/12/01
1.9K0
【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解
Django中数据库的相关操作
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
小闫同学啊
2019/07/18
2.3K0
Django中数据库的相关操作
Django—模型
ORM,全拼Object-Relation Mapping,中文意为对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。O/R中字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。目前流行的ORM产品如Java的Hibernate,.Net的EntityFormerWork等。
py3study
2020/01/16
6.3K0
Django—模型
django_数据库操作—增、删、改、查
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
py3study
2020/01/15
1.3K0
07-02 django 6-10
字段查询 all():返回模型类对应表格中的所有数据。 get():返回表格中满足条件的一条数据,如果查到多条数据,则抛异常:MultipleObjectsReturned, 查询不到数据,则抛异常:DoesNotExist。 filter():参数写查询条件,返回满足条件 QuerySet 集合数据。 条件格式: 模型类属性名__条件名=值 注意:此处是模型类属性名,不是表中的字段名 关于 filter 具体案例如下: 判等 exact。
GH
2020/04/14
7210
django model详解
1、安装pymysql模块 pip install pymysql 2、setting.py中设置引擎 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # postgresql / mysql / sqlite3 / oracle 'NAME': 'test1', # 数据库名 'USER': 'root', 'PASSWORD': 'root', 'HOST': 'localhost', # 本地:localhost 'PORT': '3306', # 默认端口:3306 } } 3、model使用流程 创建应用python manage.py startapp [应用名] settings.py中的 INSTALLED_APPS = [] 添加应用 models.py定义模型类 生成迁移python manage.py makemigrations 执行迁移python manage.py migrate 使用模型 4、字段:AutoField,BooleanField,CharField,IntegerField,FloatField,DateField,TimeField,DateTimeField,DecimalField,FileField,ImageField AutoField: 无需指定,自增长id BooleanField: Boolean类型,默认Flase;表单控件: CheckboxInput NullBooleanField: Boolean类型, 支持None, True, False CharField(max_length=字段长度20): 字符串 IntegerField: 整数 FloatField: 浮点数 DateField: datetime.date实例的日期 TimeField: datetime.time实例的时间 DecimalField(max_digits=位数总数None, decimal_places=小数点后的数字位数None): Decimal的十进制浮点数 DateTimeField([auto_now=修改时间戳False, auto_now_add=创建时间戳False]): datetime.datetime实例的日期和时间; 表单控件: TextInput + 日历控件
用户5760343
2022/05/14
7580
web开发框架之Django基础
# 基本查询 print(BookInfo.objects.all()) print(BookInfo.objects.get(btitle='雪山飞狐').id) print(BookInfo.objects.get(id=3)) print(BookInfo.objects.get(pk=3)) # 将ID=3的排除,显示其他的 print(BookInfo.objects.exclude(id=3)) print(111111111) try:   print(BookInfo.objects.get(id=12)) # except Exception as e:
py3study
2020/01/17
6.2K0
Django模型model
当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器
用户6256742
2024/06/22
3040
Django模型model
Django 模型查询2.3
简介 查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库 何时对查询集求值:迭代,序列化,与if合用 返回查
Lansonli
2021/10/09
2.5K0
django框架菜鸟教程_django框架菜鸟教程
reverse反解析 使用reverse函数,可以根据路由名称,返回具体的路径,如: from django.urls import reverse # 注意导包路径
全栈程序员站长
2022/10/05
3.2K0
Python全栈开发之Django基础
M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作
py3study
2020/01/06
3.8K0
Django框架学习(四)
我们如果是想在文件中直接运行,进行数据库的查询操作,可以按上面的步骤进行设置。并且在定义模型类的时候重写str方法(操作如下)。然后就可以进行查询了。
小闫同学啊
2019/07/18
1.5K0
Django框架学习(四)
Django学习笔记之Django ORM Aggregation聚合详解
在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序。Djngo聚合就能满足这些要求。
Jetpropelledsnake21
2018/08/01
1.1K0
python技术面试题(三)
When I let go of what I am, I become what I might be.
小闫同学啊
2019/07/18
1.1K0
python技术面试题(三)
Django 聚合与查询集API实现侧边栏
1. 聚合的产生来源于django数据库查询,通常我们使用django查询来完成增删查改,但是有时候需要更复杂的方法才能完成对数据的提取、筛选、更改,所以需要一组对象聚合来完成这种操作。模型举例如下:
菲宇
2020/03/20
1.6K0
Q查询和F查询
在filter() 等方法中,查询使用的关键字参数是通过 “SQL AND” 连接起来的。如果你要执行更复杂的查询(例如,由 SQL OR 语句连接的查询),可以使用 Q 对象。 一个 Q 对象 (django.db.models.Q) 用于压缩关键字参数集合。
zy010101
2021/10/20
1.5K0
django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)
Django数据库抽象API描述了使用Django查询来增删查改单个对象的方法。然而,你有时候会想要获取从一组对象导出的值或者是聚合一组对象。这份指南描述了通过Django查询来生成和返回聚合值的方法。
ApacheCN_飞龙
2022/11/27
1.7K0
【Django】 开发:数据库操作和后台管理
与 all () 方法不同,它会用 SQL 语句的 ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
杨丝儿
2022/02/24
4.1K0
Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询
上一篇Django 2.1.7 模型 - 条件查询、模糊查询、空查询、比较查询、范围查询、日期查询讲述了关于Django模型的查询。
Devops海洋的渔夫
2019/06/15
1.9K0
django model 条件过滤
如果需要按某个字段去掉重复的,只有数据库是 PostgreSQL 才支持,其他数据库不支持按字段去重
Autooooooo
2020/11/09
7160
相关推荐
【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验