查询集
查询集也称查询结果集,QuerySet,表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个,一个或多个过滤器。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据
- filter():返回满足条件的数据
- exclude():返回满足条件之外的数据
- order_by():对结果进行排序
返回单个值的过滤器如下:
- get():返回单个满足条件的对象
- 若未找到会抛出
DoesNotExist
异常 - 若找到多条会抛出
MultipleObjectsReturned
异常
- 若未找到会抛出
- count():返回当前查询结果的总条数
- aggregate():聚合,返回一个字典
注:判断某一个查询集中是否有数据可以使用
exists()
方法,有则返回True,反之返回False
两大特性
惰性执行:创建查询集不会访问数据库,直到用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
1
2
3
4
5
6
7# 执行下面的语句数据库并不会进行查询
books = BookInfo.objects.all()
# 只有当真正使用时,才会真正去数据库进行查询
for b in books:
print(b)缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用查询集时会使用缓存的数据。
1
2
3
4
5# 进行数据库实际查询遍历,保存结果到books,会进行数据库实际交互
books = [b.id for b in BookInfo.objects.all()]
# 再次调用books,不再进行数据库查询,而是使用缓存结果
print(books)注:对查询集进行取下标或切片操作,等同于sql中的limit和offset