前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django 2.1.7 查询集 QuerySet

Django 2.1.7 查询集 QuerySet

作者头像
Devops海洋的渔夫
发布于 2019-06-15 10:21:00
发布于 2019-06-15 10:21:00
1.2K00
代码可运行
举报
文章被收录于专栏:Devops专栏Devops专栏
运行总次数:0
代码可运行

上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。

不管什么查询,返回的结果都基本是查询集QuerySet,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [16]: MiddlewareInfo.objects.all()
Out[16]: <QuerySet [<MiddlewareInfo: MiddlewareInfo object (1)>, <MiddlewareInfo: MiddlewareInfo object (2)>, <MiddlewareInfo:
MiddlewareInfo object (3)>, <MiddlewareInfo: MiddlewareInfo object (4)>, <MiddlewareInfo: MiddlewareInfo object (5)>, <Middlewa
reInfo: MiddlewareInfo object (6)>, ...

其中查询集具有缓存、返回多个值、返回单个值、对查询集切片处理等功能。

参考文献

https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#caching-and-querysets

返回查询集的过滤器如下:

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
  • order_by():对结果进行排序。

返回单个值的过滤器如下:

  • get():返回单个满足条件的对象
    • 如果未找到会引发"模型类.DoesNotExist"异常。
    • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
  • count():返回当前查询结果的总条数。
  • aggregate():聚合,返回一个字典。

判断某一个查询集中是否有数据:

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [18]: MiddlewareInfo.objects.filter( server_id__exact = 2 )

Out[18]: <QuerySet [<MiddlewareInfo: MiddlewareInfo object (3)>, <MiddlewareInfo: MiddlewareInfo object (4)>, <MiddlewareInfo:
MiddlewareInfo object (12)>, <MiddlewareInfo: MiddlewareInfo object (13)>]>

In [19]: MiddlewareInfo.objects.filter( server_id__exact = 2 ).exists()
Out[19]: True

In [20]: MiddlewareInfo.objects.filter( server_id__exact = 3 )
Out[20]: <QuerySet []>

In [21]: MiddlewareInfo.objects.filter( server_id__exact = 3 ).exists()
Out[21]: False

两大特性

  • 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
  • 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

查询集的缓存

每个查询集都包含一个缓存来最小化对数据库的访问。

在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。

示例一: 经过存储后,可以重用查询集,第二次使用缓存中的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [29]: list = MiddlewareInfo.objects.filter( server_id__exact = 2 )

In [30]: [ item.name for item in list ]
Out[30]: ['nginx', 'kafka', 'mysql', 'mongodb']

In [31]: [ item.name for item in list ]
Out[31]: ['nginx', 'kafka', 'mysql', 'mongodb']

使用这种方式读取查询集,访问mysql中执行SQL的次数只有第一次读取的时候执行。

mysql日志如下:

示例二: 如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [32]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact = 2 ) ]
Out[32]: ['nginx', 'kafka', 'mysql', 'mongodb']

In [33]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact = 2 ) ]
Out[33]: ['nginx', 'kafka', 'mysql', 'mongodb']

可以看到每次读取list的数据时,都进行这个查询集的执行,所以mysql执行日志有两次,如下:

限制查询集

可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。

注意:不支持负数索引。

对查询集进行切片后返回一个新的查询集,不会立即执行查询。

如果获取一个对象,直接使用0,等同于0:1.get(),但是如果没有数据,0引发IndexError异常,0:1.get()如果没有数据引发DoesNotExist异常。

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
In [34]: MiddlewareInfo.objects.all()[0:2]
Out[34]: <QuerySet [<MiddlewareInfo: MiddlewareInfo object (1)>, <MiddlewareInfo: MiddlewareInfo object (2)>]>

In [35]: MiddlewareInfo.objects.all()[0:1]
Out[35]: <QuerySet [<MiddlewareInfo: MiddlewareInfo object (1)>]>

In [36]: MiddlewareInfo.objects.all()[0]
Out[36]: <MiddlewareInfo: MiddlewareInfo object (1)>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django 2.1.7 模型 - 条件查询、模糊查询、空查询、比较查询、范围查询、日期查询
上一篇Django 2.1.7 模型 - MVT模型增删功能讲述了关于MVT模型中列表的增加数据以及删除数据的功能,在数据返回的过程中,也有部分关于模型之间关联查询的数据。
Devops海洋的渔夫
2019/06/15
10.9K0
Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询
上一篇Django 2.1.7 模型 - 条件查询、模糊查询、空查询、比较查询、范围查询、日期查询讲述了关于Django模型的查询。
Devops海洋的渔夫
2019/06/15
1.9K0
查询集 QuerySet和管理器Mana
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
py3study
2020/01/16
1.1K0
【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith. 3) 空查询
愚公搬代码
2022/12/01
1.9K0
【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解
Django之QuerySet详解
在内部,创建、过滤、切片和传递一个QuerySet不会真实操作数据库,在你对查询集提交之前,不会发生任何实际的数据库操作。可以使用下列方法对QuerySet提交查询操作:
菲宇
2022/12/21
2.5K0
Django 模型查询2.3
简介 查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库 何时对查询集求值:迭代,序列化,与if合用 返回查
Lansonli
2021/10/09
2.4K0
Django 2.1.7 模型管理器 models.Manager 以及 元选项
上一篇Django 2.1.7 模型的关联 讲述了关于Django模型一对多、多对多、自关联等模型关系。
Devops海洋的渔夫
2019/06/17
9990
Django 2.1.7 模型管理器 models.Manager 以及 元选项
Django 2.1.7 模型的关联
上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的F对象、Q对象、聚合查询等功能。
Devops海洋的渔夫
2019/06/17
1.6K0
Django 2.1.7 模型的关联
Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06
在 django 中要想创建一个数据对象,只需要实例化他,传入这个表模型类的关键字参数,然后调用 .save() 方法把这个对象保存到数据库中即可
suwanbin
2019/09/26
2.9K0
django 1.8 官方文档翻译: 2-2-1 执行查询
一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行增删改查的操作。这篇文档阐述了如何使用这些API。关于所有模型检索选项的详细内容,请见数据模型参考。
ApacheCN_飞龙
2022/11/27
4.5K0
Django中数据库的相关操作
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
小闫同学啊
2019/07/18
2.3K0
Django中数据库的相关操作
Django模型model
当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器
用户6256742
2024/06/22
2830
Django模型model
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 MVT之M
在Django MVC概述和开发流程中已经讲解了Django的MVT开发流程,本文重点对MVT中的模型(Model)进行重点讲解。
菜菜cc
2022/11/15
1.1K0
Django 2.1.7 基于默认sqlite3 模型设计 以及 数据操作
一般操作数据库是通过写sql语句,那么能不能不写sql语句就可以操作数据库呢? 可以,就是通过接下来要给大家讲的ORM框架。
Devops海洋的渔夫
2019/06/11
9950
Django 2.1.7 基于默认sqlite3 模型设计 以及 数据操作
07-02 django 6-10
字段查询 all():返回模型类对应表格中的所有数据。 get():返回表格中满足条件的一条数据,如果查到多条数据,则抛异常:MultipleObjectsReturned, 查询不到数据,则抛异常:DoesNotExist。 filter():参数写查询条件,返回满足条件 QuerySet 集合数据。 条件格式: 模型类属性名__条件名=值 注意:此处是模型类属性名,不是表中的字段名 关于 filter 具体案例如下: 判等 exact。
GH
2020/04/14
7170
Django 2.1.7 模型 - MVT模型增删功能
上一篇Django 2.1.7 模型类 - 字段类型讲述了关于模型字段类的内容,丰富了不少模型中的字段类型。
Devops海洋的渔夫
2019/06/15
4810
【Django】Django ORM 学习笔记
ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。下面是一个示例。通过使用 ORM,我们只需要操作 Author 和 Blog 对象,而不用操作相关的数据库表。这里主要介绍一下 Django ORM 的相关使用。
零式的天空
2022/03/25
2.3K0
Django学习笔记之Queryset详解
    Django ORM用到三个类:Manager、QuerySet、Model。Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet:Manager类的一些方法会返回QuerySet实例,QuerySet是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大,通过自定义model的instance可以获取外键实体等,它的方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录的总数,查看所有记录,这些应该放在自定义的manager类中。以Django1.6为基础。
Jetpropelledsnake21
2018/08/01
2.8K0
django模型
每个字段有一些特有的参数,例如,CharField(和它的派生类)需要max_length 参数来指定 VARCHAR 数据库字段的大小
程序员同行者
2018/08/16
3.3K0
相关推荐
Django 2.1.7 模型 - 条件查询、模糊查询、空查询、比较查询、范围查询、日期查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验