通过 模型类.objects 属性可以调用如下函数,实现对模型类对应的数据表的查询。
函数名 |
功能 |
返回值 |
说明 |
get |
返回表中满足条件的一条且只能有一条数据。 |
返回值是一个模型类对象。 |
参数中写查询条件。
|
all |
返回模型类对应表格中的所有数据。 |
返回值是QuerySet类型 |
查询集 |
filter |
返回满足条件的数据。 |
返回值是QuerySet类型 |
参数写查询条件。 |
exclude |
返回不满足条件的数据。 |
返回值是QuerySet类型 |
参数写查询条件。 |
order_by |
对查询结果进行排序。 |
返回值是QuerySet类型 |
参数中写根据哪些字段进行排序。 |
以下下示例都是在项目交互环境执行,数据都是之前bookltest应用里BookInfo类(from booktest.models import BookInfo):
get示例:
例:查询图书id为3的图书信息
BookInfo.objects.get(id=1)
all方法示例:
例:查询图书所有信息
BookInfo.objects.all()
条件格式:模型类属性名__条件名=值 (__双下划线)
a)查询等
exact表示判等
例:查询编号为1的图书
BookInfo.objects.get(id__exact=1) # __双下划线
可以简写为:BookInfo.objects.get(id=1)
b)模糊查询
contains:是否包含,说明:如果要包含%无需转义,直接写即可。
例:查询书名包含'传'的图书
BookInfo.objects.filter(b_title__contains='传')
startswith、endswith:以指定值开头或结尾
例:查询书名以'部'结尾的图书
BookInfo.objects.filter(b_title__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith
c)空查询
isnull:是否为null
例:查询书名不为空的图书
sql: select * from booktest_bookinfo where btitle is null;
BookInfo.objects.filter(b_title__isnull=True)
d)范围查询
in:是否包含在范围内
例:查询编号为1或3或5的图书
select * from booktest_bookinfo where id in (1,3,5)
BookInfo.objects.filter(id__in=[1,3,5])
e)比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于
例:查询编号大于3的图书
select * from booktest_bookinfo where id > 3;
BookInfo.objects.filter(id__gt=3)
f)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
例:查询1980年发表的图书。
BookInfo.objects.filter(b_pubdate__year=1980)
例:查询1980年1月1日后发表的图书。
BookInfo.objects.filter(b_pubdate__gt = date(1980,1,1))
例:查询id不为3的图书信息。
BookInfo.objects.exclude(id=3)
作用:进行查询结果进行排序,默认从小到大排序
例:查询所有图书的信息,按照id从小到大进行排序
BookInfo.objects.all().order_by('id')
可以简写为:
BookInfo.objects.order_by('id')
例:查询所有图书的信息,按照id从大到小进行排序
BookInfo.objects.all().order_by('-id')
例:把id大于3的图书信息按阅读量从大到小排序显示
BookInfo.objects.filter(id__gt=3).order_by('-b_read')
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 使用F对象,被定义在django.db.models中
作用:用于类属性之间的比较
使用之前需要先导入:
from django.db.models import F
语法如下:
F(属性名)
例:查询图书阅读量大于评论量图书信息
BookInfo.objects.filter(b_read__gt=F('b_comment'))
例:查询图书阅读量大于2倍评论量图书信息。
BookInfo.objects.filter(b_read__gt=F('b_comment')*2)
Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
作用:用于查询时的逻辑关系。not and or,可以对Q对象进行&|~(&-与,|-或,~-非)操作
使用之前需要先导入:
from django.db.models import Q
例:查询id大于3且阅读量大于30的图书的信息
BookInfo.objects.filter(id__gt=3, b_read__gt=30)
或
BookInfo.objects.filter(Q(id__gt=3)&Q(b_read__gt=30))
例:查询id大于3或者阅读量大于30的图书的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(b_read__gt=30))
例:查询id不等于3图书的信息。
BookInfo.objects.filter(~Q(id=3))
使用aggregate()过滤器调用聚合函数,返回值是一个字典类型,格式如下:
{'聚合类小写__属性名':值}
如:{'sum__bread':3}
聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中
作用:对查询结果进行聚合操作
使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
例:查询所有图书的数目
BookInfo.objects.all().aggregate(Count('id'))
返回值类型:
{'id__count': 6}
例:查询所有图书阅读量的总和
BookInfo.objects.all().aggregate(Sum('b_read'))
BookInfo.objects.aggregate(Sum('b_read'))
作用:统计满足条件数据的数目
例:统计所有图书的数目
BookInfo.objects.all().count()
BookInfo.objects.count()
例:统计id大于3的所有图书的数目。
BookInfo.objects.filter(id__gt=3).count()
查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
返回查询集的过滤器如下:
返回单个值的过滤器如下:
判断某一个查询集中是否有数据:
两大特性
查询集的缓存
每个查询集都包含一个缓存来最小化对数据库的访问。
在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。
演示:运行项目shell
python manage.py shell
情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载
日志文件发生两次查询
情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据
日志文件只发生一次查询
限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句
注意:不支持负数索引
对查询集进行切片后返回一个新的查询集,不会立即执行查询
获取一个对象: