01. 概念
Django的ORM中存在 查询集 的概念。
查询集,也称查询结果集、QuerySet
,表示从数据库中获取的对象集合。 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
对查询集可以再次调用过滤器进行过滤,如:
>>> films=FilmInfo.objects.filter(playcount gt=30).order_by('pub_date')
>>> films
<QuerySet [<FilmInfo: 美人鱼==2020-10-11>, <FilmInfo: 大话西游==2021-10-10>, <FilmInfo: 小红帽==2021-12-06>, <FilmInfo: 长津湖==2021-12-07>]>
也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制 查询的结果。
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子 句。
判断某一个查询集中是否有数据:
- exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
>>> FilmInfo.objects.filter(fid=2).exists()
True
>>> FilmInfo.objects.filter(fid=1).exists()
False
02 两大特性
1)惰性执行
当执行查询操作返回QuerySet时,默认查询前21条数据。
films = FilmInfo.objects.all()
查看映射SQL:select * from t_filminfo limit 21;
2)缓存
默认情况下,QuerySet会把结果存放在内置当缓存中。 QuerySet提供了_result_cache 的变量专门存储缓存。
Django 3.1
>>> from film.models import FilmInfo,PeopleInfo
>>> fs=FilmInfo.objects.all()
>>> fs._result_cache
[<FilmInfo: 大话西游==2021-10-10>, <FilmInfo: 长津湖==2021-12-07>, <FilmInfo: 小红帽==2021-12-06>, <FilmInfo: 美人鱼==2020-10-11>]
# 当执行完这条语句后,films._result_cache能够查看到结果。
03. 限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的 limit 和 offset 子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
如果获取一个对象,直接使用[0],等同于[0E1].get()
,但是如果没有数据,[0]
引发
IndexError
异常,[0E1].get()
如果没有数据引发DoesNotExist
异常。
示例:获取第1、2项,运行查看。
>>> films = FilmInfo.objects.all()[0:2]
>>> films
<QuerySet [<FilmInfo: 大话西游==2021-10-10>, <FilmInfo: 长津湖==2021-12-07>]>
04. 分页
分页官方文档
#查询数据
>>>films = FilmInfo.objects.all()
#导入分页类
>>>from django.core.paginator import Paginator
#创建分页实例 paginator=Paginator(films,2) #获取指定页码的数据
>>>page_skus = Paginator(fs,1)
#获取分页数据
>>> page_skus.num_pages
4