【Django入门】——查询集QuerySet介绍

在文章【Django入门】——通过模型类查询MySQL数据库基本操作中,我们知道函数all()filter()exclude()order_by()等的返回值都是QuerySet类型,对该类型的返回值可以继续使用上述查询函数。QuerySet类型具有一些特性:

1. 懒惰查询

在使用返回值类型为QuerySet的函数进行查询时,即使得到了QuerySet类型的返回值,也并不意味着此时通过模型类完成了对数据库的查询操作,只有当使用查询集中的数据时,才会真正完成对数据库的查询操作。也就是说,对于下述代码,在# 1处,并不会产生对数据库的实际查询,只有到# 2处,才会发生数据库查询。

>>> from booktest.models import BookInfo
>>> books = BookInfo.objects.all()  # 1
>>> books  # 2
<QuerySet [<BookInfo: BookInfo object (1)>, <BookInfo: BookInfo object (2)>, <BookInfo: BookInfo object (3)>, <BookInfo: BookInfo object (4)>]>

2. 查询缓存

所谓查询缓存是指,当使用的同一个查询集时,第一次使用时会发生数据库的实际查询,然后查询结果会被缓存起来,之后再使用这个查询集时,使用的只是缓存中的结果,而不会发生重复的查询。即对于下列案例,在# 1处不会发生实际的数据库查询,只有在# 2处会发生查询,且# 3处由于使用了和# 2处相同的查询集,则# 3处直接使用经# 2查询出来的数据集。

>>> books = BookInfo.objects.all()  # 1
>>> [_ for _ in books]  # 2
[<BookInfo: BookInfo object (1)>, <BookInfo: BookInfo object (2)>, <BookInfo: BookInfo object (3)>, <BookInfo: BookInfo object (4)>]
>>> [_ for _ in books]  # 3
[<BookInfo: BookInfo object (1)>, <BookInfo: BookInfo object (2)>, <BookInfo: BookInfo object (3)>, <BookInfo: BookInfo object (4)>]

3. 查询切片

查询集具有和Python中列表和元组类似,支持切片功能,语法也基本一致:QuerySet[start:end:step],但是需要注意的是,查询集的下标不予许为负。

4. 判断有无

最后补充一点,有时候如果查询集中数据为空,那么对该查询集进一步操作则会产生异常,则代码中需要进行异常处理,而查询集支持一个exist()函数,可以判断其是否为空,若不为空返回True,否则返回False

>>> books = BookInfo.objects.all()
>>> books.exists()
True
>>> books[0:0].exists()
False

猜你喜欢

转载自blog.csdn.net/weixin_37780776/article/details/107593506
今日推荐