10 查询 查询集
查询函数:
通过模型类.objects属性可以调用如下函数,实现对模型类对应数据表的查询
函数名 | 功能 | 返回值 | 说明 |
get | 返回表中满足条件的一条且只能有一条数据 | 返回一个模型类对象 |
参数中写查询条件。 1、若查询到多条数据则抛异常:MultipleObjectsReturned. 2、查询不到数据则抛异常:DoesNotExist. |
all | 返回模型类对应表中所有数据 | 返回值是QuerySet类型 | 返回查询集,无参数 |
filter | 返回满足条件的数据 | 返回值是QuerySet类型 | 参数写查询条件 |
exclude | 返回不满足条件的数据 | 返回值是QuerySet类型 | 参数写查询条件 |
order_by | 对查询结果进行排序 | 返回值是QuerySet类型 | 参数中写根据哪些字段进行排序 |
filter函数(查询满足条件的数据):
模糊查询:
例:查询书名包含‘传’的图书 contains
BookInfo.objects.filter(btitle__contains='传')
endswith startswith
例:查询书名包含‘部’结尾的图书
BookInfo.objects.filter(btitle__endswith='部')
空查询 isnull
例:查询书名不为空的图书
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
范围查询 in
例:查询id为1 或 3 或 5 的图书
select * from booktest_bookinfo where id in (1,3,5)
BookInfo.objects.filter(id__in=[1,3,5])
比较查询 gt(greate than)大于 lt(less than) 小于 gte(equal)大于等于 lte小于等于
例:查询id大于3的图书
select * from booktest_bookinfo where id > 3;
BookInfo.objects.filter(id__gt=3)
日期查询 year month day
例:查询1980年出版的图书
BookInfo.objects.filter(bpub__year=1980)
例:查询1980年1月1日后出版的图书
from datatime import date
BookInfo.objects.filter(bpub__gt=date(1980,1,1))
exclude函数 (返回不满足条件的数据)
例:查询id不等于3的图书
BookInfo.objects.exclude(id=3)
order_by函数
例:查询所有图书,按id从小到大排序
BookInfo.objects.all().order_by('id')
也可以:
BookInfo.objects.order_by('id')
例:查询所有图书,按id从大到小排序
BookInfo.objects.all().order_by('-id')
也可以(对表中所有数据进行查询时,.all()可以省略):
BookInfo.objects.order_by('-id')
例:把id大于3的图书信息按阅读量从大到小排序
BookInfo.objects.filter(id__gt=3).order_by('-bread')
Q对象
作用:用于查询时条件之间的逻辑关系,not and or,也可对Q对象进行 &|~ 操作(&与 |或 ~非)
使用Q对象,需要先导入:
from django.db.models import Q
例:查询id大于3且阅读量大于30的图书,且(and)可以不用Q对象,也可以用Q对象
不用Q对象:BookInfo.objects.filter(id__gt=3,bread__gt=30)
用Q对象:BookInfo.object.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查询id大于3或者阅读量大于30的图书。或(or)必须用Q对象:
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查询id等于3的图书,Q前面加波浪号,表示取反
BookInfo.objects.filter(~Q(id=3))
F对象
作用:用于类属性之间的比较
使用之前先导入:
fromdjango.db.models import F
例:查询阅读量大于评论量的图书信息
BookInfo.objects.filter(bread__gt=F('bcomment'))
例:查询阅读量大于2倍评论量的图书信息
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
聚合函数
作用:对查询结果进行聚合操作
sum count avg max min
aggregate:调用这个函数来使用聚合,返回值是一个字典
使用前先导入:
from django.db.models import Sum,Count,Max,Min,Avg
例:查询所有图书的数目
BookInfo.objects.all().aggregate(count('id')) #count()中不能写*,要写一个字段,比如按'id'统计,返回值为一个字典:{'id__count':5}
PS:.all()同样可以省略:
BookInfo.objects.aggregate(count('id))
例:查询所有图书的阅读量总和
BookInfo.objects.aggregate(sum('bread'))
返回:{'bread__sum':125}
count函数 返回值是一个数字
作用:统计满足条件数据的数目
例:统计所有图书的数目
BookInfo.objects.all.count()
也可以:
BookInfo.objetcs.count()
例:统计id大于3的图书数目
BookInfo.objects.filter(id__gt=3).count()
查询集
all, filter, exclude, order_by,调用这些函数会返回一个查询集(QuerySet对象),对于一个QuerySet对象,可以继续调用以上所有函数。
查询集特性:
1、惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询
2、缓存:当使用的是同一个查询集时,第一次的时候会发生实际的数据库查询,然后把结果缓存,之后再使用这个查询集时,使用的是缓存的结果
限制查询集:
可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。
取出查询集第一条数据的两种方式:
方式 | 说明 |
b[0] | 如果b[0]不存在,会抛IndexError异常 |
b[0:1].get() | 如果不存在,会抛DoesNotExist异常 |
exists(): 判断一个查询集中是否有数据。True False