Django框架(9)_模型 :查询、F对象、Q对象、聚合函数、查询集

查询函数

通过  模型类.objects  属性可以调用如下函数,实现对模型类对应的数据表的查询。

函数名

功能

返回值

说明

get

返回表中满足条件的一条且只能有一条数据。

返回值是一个模型类对象。

参数中写查询条件。

  1. 如果查到多条数据,则抛异常MultipleObjectsReturned。
  2. 查询不到数据,则抛异常:DoesNotExist。

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()

条件查询

条件格式:模型类属性名__条件名=值 (__双下划线)

filter方法示例:

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))

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')

例:把id大于3的图书信息按阅读量从大到小排序显示

BookInfo.objects.filter(id__gt=3).order_by('-b_read')

F对象

之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 使用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'))

count函数,返回值是一个数字

作用:统计满足条件数据的数目

例:统计所有图书的数目

BookInfo.objects.all().count()

BookInfo.objects.count()

例:统计id大于3的所有图书的数目。

BookInfo.objects.filter(id__gt=3).count()

查询集

查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。

返回查询集的过滤器如下:

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
  • order_by():对结果进行排序

返回单个值的过滤器如下:

  • get():返回单个满足条件的对象
    • 如果未找到会引发"模型类.DoesNotExist"异常
    • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
  • count():返回当前查询结果的总条数
  • aggregate():聚合,返回一个字典

判断某一个查询集中是否有数据

  • exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

两大特性

  • 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
  • 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

查询集的缓存

每个查询集都包含一个缓存来最小化对数据库的访问。

在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。

演示:运行项目shell

python manage.py shell

情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载

日志文件发生两次查询

情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据

日志文件只发生一次查询

限制查询集

可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句

注意:不支持负数索引

对查询集进行切片后返回一个新的查询集,不会立即执行查询

获取一个对象:

  • 直接使用[0],等同于[0:1].get()
  • 如果没有数据,[0]引发IndexError异常;[0:1].get()引发DoesNotExist异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轨迹|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值