一、概念
Django的ORM中存在 查询集 的概念。
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调⽤如下过滤器⽅法时,Django会返回查询集(⽽不是简单的列表):
all():返回所有数据。
filter():返回满⾜条件的数据。
exclude():返回满⾜条件之外的数据。
order_by():对结果进⾏排序。
对查询集可以再次调⽤过滤器进⾏过滤,如
FilmInfo.objects.filter(fid__gt=2).order_by('pub_date')
<QuerySet [<FilmInfo: shell>, <FilmInfo: 我爱你中国>, <FilmInfo: 我和我的家人>, <FilmInfo: 夺冠>, <FilmInfo: 我爱你china>]>
也就意味着查询集可以含有零个、⼀个或多个过滤器。过滤器基于所给的参数限制查询的结果。
从SQL的⻆度讲,查询集与select语句等价,过滤器像where、limit、order by⼦句。
判断某⼀个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
FilmInfo.objects.filter(fid__gt=2).order_by('pub_date').exists()
True
二、两⼤特性
1、惰性执⾏
当执⾏查询操作返回QuerySet时,默认查询前21条数据。
2、缓存
默认情况下,QuerySet会把结果存放在内置当缓存中。 QuerySet提供了_result_cache 的变量专⻔存储缓存。
三、限制查询集
可以对查询集进⾏取下标或切⽚操作,等同于sql中的 limit 和 offset ⼦句。
注意:不⽀持负数索引。
对查询集进⾏切⽚后返回⼀个新的查询集,不会⽴即执⾏查询。
如果获取⼀个对象,直接使⽤[0],等同于[0:1].get(),
film=FilmInfo.objects.all()
film[0]
<FilmInfo: django>
但是如果没有数据,[0]引发IndexError异常,
film=FilmInfo.objects.all()
film[9]
IndexError: list index out of range
[0:1].get()如果没有数据引发DoesNotExist异常。
四、分页
from film.models import PeopleInfo,FilmInfo
from django.core.paginator import Paginator
fs=FilmInfo.objects.all()
pageobj=Paginator(fs,1)
<input>:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'film.models.FilmInfo'> QuerySet.
fs=FilmInfo.objects.all().order_by('playcount')
pageobj=Paginator(fs,1)
pageobj.page(1)
<Page 1 of 7>
pageobj.page(4)
<Page 4 of 7>
pageobj.num_pages
7
:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class ‘film.models.FilmInfo’> QuerySet.
表示分页前先得进行排序from django.core.paginator import Paginator
:分页类pageobj=Paginator(fs,1)
:分页对象fs:查询集;1:每页展示1条数据
pageobj.page(1)
:第一页pageobj.num_pages
:总页数