查询集
- 查询集:表示从数据库中获取的模型对象集合
-
- 在管理器上调用过滤器方法会返回查询集
- 查询集可以含有0个、一个或多个过滤器
- 过滤器:基于所给的参数限制查询的结果
- 提示:从sql的角度,查询集和select语句等价,过滤器像where和limit子句
- 返回列表的过滤器如下:
-
- all():返回所有的数据
- filter():返回满足条件的数据
- exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
- order_by():返回排序后的数据
- 返回单个对象的过滤器如下:
-
- get():返回单个满足条件的对象
-
- 如果未找到会引发"模型类.DoesNotExist"异常
- 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
- count():返回当前查询的总条数
- aggregate():聚合
- exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
查询集的两个特点
1、惰性执行:
创建查询集不会访问数据库,直到在模板中调用数据时,才会访问数据库
- 调用数据的情况包括迭代、序列化、与if合用
2、缓存:查询集的结果被存下来之后,再次查询相同数据时会使用之前缓存的数据
基础条件查询
- 查询所有
bookInfos = BookInfo.book.all()
- 1、查询id=1 的书本
bookInfos = BookInfo.book.filter(id__exact=1)
- 2、查询包含'湖'的书籍
bookInfos = BookInfo.book.filter(name__contains='湖')
- 3、查询义'部'结尾的书籍
bookInfos = BookInfo.book.filter(name__endswith='部')
- 4、 查询书籍名不能为空
bookInfos = BookInfo.book.filter(name__isnull=False)
- 5、查询编号为2或4的书籍
bookInfos = BookInfo.book.filter(pk__in=[2,4])
- 6、查询编号大于2的书籍
gt、gte、lt、lte: 大于、大于等于、小于、小于等于
bookInfos = BookInfo.book.filter(id__gt=2)
- 7、查询ID不等于3的书籍(exclue)
bookInfos = BookInfo.book.exclude(id=3)
- 8 查询1980年出版的书籍
year、month、day、week_day、hour、minute、second: 对日期时间类型的属性进行运算
bookInfos = BookInfo.book.filter(pub_date__year='1980')
- 9、查询1990年1月1日后发表的书籍
from datetime import date
bookInfos = BookInfo.book.filter(pub_date__gt=date(1990,1,1))
或者
bookInfos = BookInfo.book.filter(pub_date__gt=‘1990-01-01’)
F方法与Q方法
导入函数
from django.db.models import F,Q
F('属性名')
1、查询阅读量大于评论量的书籍
bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount'))
2、查询阅读量大于2倍评论量的书籍:F支持乘法运算
bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount')*2)
Q对象查询需求
from django.db.models import Q
Q(模型属性1__条件运算符=值) | Q(模型属性2__条件运算符=值)
1.查询阅读量大于20,或编号小于3的图书
bookInfos = BookInfo.books.filter(Q(readcount__gt=20) | Q(id__lt=3))
2.查询编号不等于3的书籍(Q对象前可以使用〜操作符,表示非
bookInfos = BookInfo.books.filter(~Q(id=3))
或
bookInfos = BookInfo.books.exclude(id=3)
聚合函数
- 使用aggregate()过滤器调用聚合函数,返回单个对象
- 聚合函数包括Avg:Max,Min,Sum, ,Count
-
- 使用Count时,不需要一般aggregate()过滤器,直接调用即可
- 定义被在django.db.models中
from django.db.models import Sum
def bookList(request):
# 查询编号不等于3的书籍
bookInfos = BookInfo.books.filter(~Q(id=3))
# 统计总的阅读量
readcount = BookInfo.books.aggregate(Sum('readcount'))
# 构造上下文
context = {'booklist':bookInfos,'readcount':readcount}
return render(request, 'Book/booklist.html', context)
关联查询
基础关联查询
# 1.查询编号为1的图书中所有人物信息
# 2.查询编号为1的英雄出自的书籍
- 1.查询编号为1的图书中所有人物信息
-
- 通过书找关联的人
# 先查编号为1的书
book = BookInfo.books.get(pk=1)
# 再通过关联查询到编号为1的书里面的任务信息
peopleInfos = book.peopleinfo_set.all()
- 通过书找关联的人
- 2.查询编号为1的英雄出自的书籍
-
- 通过人找关联的书
# 先查编号为1的人物
people = PeopleInfo.objects.get(pk=1)
# 再通过关联查询编号为1的人物对应的书
bookInfo = people.book
- 通过人找关联的书
内连接查询
- 语法如下 :
关联模型类名小写__属性名__运算符=值 -
- 结果和sql中的inner join相同(内连接)
- 需求
# 1.查询书名为"天龙八部"的所有人物信息
# 2.查询书籍中人物的描述包含"降龙"的书籍 - 1.查询书名为"天龙八部"的所有人物信息(peopleInfo)
- 通过书找关联的人
-
- # 原始内连接sql语句:
select p.name, b.name from peopleinfo as p inner join bookinfo as b on p.book_id = b.id where b.name = "天龙八部"
peopleInfos = PeopleInfo.objects.filter(book__name='天龙八部')
bookInfos = BookInfo.books.filter(peopleinfo__description__contains='降龙')
- 2.查询书籍中人物的描述包含"降龙"的书籍
-
- 通过人找关联的书
自关联查询