python 开发实战 2-9模型 查询集

本文介绍了Django ORM中的查询集概念,包括all(), filter(), exclude(), order_by()等过滤器方法。查询集具备惰性执行和缓存两大特性,并能通过切片实现分页。通过exists()检查查询集是否包含数据,切片操作模拟了SQL的limit和offset,而获取单个对象可能会触发异常。" 124746025,7565040,CMake的全平台安装指南,"['CMake', '构建工具', 'Windows安装', 'Linux安装', 'MacOS安装']
摘要由CSDN通过智能技术生成

python 开发实战 2-9模型 查询集

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值