ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 查询集`QuerySet` ## 一、基本使用 **1)**当调用模型管理器的`all`,`filter`,`exclude`,`order_by`等方法时,返回的是一个`QuerySet`对象,**表示从数据库查询到的数据集合**; | objects管理器中的方法 | 返回类型 | 作用 | | --- | --- | --- | | 模型类.objects.all() | QuerySet | 查询所有的对象 | | 模型类.objects.filter() | QuerySet | 查询满足条件的对象 | | 模型类.objects.exclude() | QuerySet | 查询不满条件的对象 | | 模型类.objects.order\_by() | QuerySet | 对查询结果集进行排序 | **2)**`QuerySet`提供的方法 | `QuerySet`方法 | 返回类型 | 作用 | | --- | --- | --- | | get() | 模型对象 | **查询一个对象,且只能有一个**: 如果查到多条数据,则报:`MultipleObjectsReturned` 如果查询不到数据,则报:`DoesNotExist` | | all() | QuerySet | 查询所有的对象 | | count() | 数字 | 查询总共有多少条数据 | | filter() | QuerySet | 查询满足条件的对象 | | exclude() | QuerySet | 查询不满条件的对象 | | order\_by() | QuerySet | 对查询结果集进行排序 | | aggregate() | 字典,例如: {'salary\_\_avg': 9500.0} | 进行聚合操作`Sum, Count, Max, Min, Avg` | | exists() | 布尔型 | True表示有查询集中有数据,否则没有 | 链式写法:`Employee.objects.filter(id__gt=3).order_by('-age')` **3)**支持**下标**和**切片**操作 1. `query_set[0]`:取出查询集中的第一条数据,不存在会抛`IndexError`异常 2. `query_set[0:2]`:切片操作得到另一个新的`QuerySet` 3. **注意:下标不能为负数** ## 二、查询集两大特性 **1\. 惰性查询** * 创建查询集时不会访问数据库,操作查询集中的数据时才会访问; * 操作查询集指**下标、切片、迭代操作,与if合用**等 ~~~ # 得到查询集,不会访问数据库 query_set = Department.objects.all() # 此时才访问数据库 print(query_set[0]) ~~~ **2\. 缓存功能** 1. 当遍历(迭代)访问查询集**所有数据**,会缓存查询集所有数据,当再次操作该查询集中的数据时,将会使用缓存; ~~~ # 创建查询集 query_set = Department.objects.all() # 会查询数据库 [dep.name for dep in query_set] # 使用缓存,不再查数据库 [dep.name for dep in query_set] ~~~ 2. 如果只是访问查询集**部分数据**(下标或切片)不会缓存 ~~~ # 创建查询集 query_set = Department.objects.all() # 会查询数据库 query_set[0] # 会查询数据库 query_set[0] ~~~