Python—Django:关于在Django框架中对数据库的查询函数,查询集和关联查询

一. 查询函数(get,filter,exclude)

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

函数名功能返回值说明
get返回表中满足条件的一条且只能有一条数据。返回值是一个模型类对象。参数中写查询条件。1) 如果查到多条数据,则抛异常MultipleObjectsReturned。2) 查询不到数据,则抛异常:DoesNotExist。
all返回模型类对应表格中的所有数据。返回值是QuerySet类型查询集
filter返回满足条件的数据。返回值是QuerySet类型参数写查询条件。
exclude返回不满足条件的数据。返回值是QuerySet类型参数写查询条件。
order_by对查询结果进行排序。返回值是QuerySet类型参数中写根据哪些字段进行排序。

·

a)判等 条件名:exact。

例:查询编号为1的图书。

BookInfo.objects.get(id=1)

b)模糊查询

例:查询书名包含’传’的图书。contains

BookInfo.objects.filter(btitle__contains='传')

例:查询书名以’部’结尾的图书 endswith 开头:startswith

BookInfo.objects.filter(btitle__endswith='部')

c)空查询 isnull

例:查询书名不为空的图书。isnull

select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)范围查询 in

例:查询id为1或3或5的图书。

select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比较查询 gt(greate than) lt(less than) gte(equal) 大于等于lte 小于等于

例:查询id大于3的图书。

Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查询

例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

例:查询1980年1月1日后发表的图书。

from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))

exclude方法示例:

例:查询id不为3的图书信息。

BookInfo.objects.exclude(id=3)

order_by方法示例:
作用:进行查询结果进行排序。
例:查询所有图书的信息,按照id从小到大进行排序。

BookInfo.objects.all().order_by('id')

例:查询所有图书的信息,按照id从大到小进行排序。

BookInfo.objects.all().order_by('-id')

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

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

F对象(作用:用于类属性之间的比较。)

使用之前需要先导入:

from django.db.models import F

例:查询图书阅读量大于评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查询图书阅读量大于2倍评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q对象(作用:用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作。)

使用之前需要先导入:

from django.db.models import Q

例:查询id大于3且阅读量大于30的图书的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查询id大于3或者阅读量大于30的图书的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查询id不等于3图书的信息。

BookInfo.objects.filter(~Q(id=3))

聚合函数 (作用:对查询结果进行聚合操作。)

sum count avg max min

aggregate:调用这个函数来使用聚合。 返回值是一个字典

使用前需先导入聚合类:

from django.db.models import Sum,Count,Max,Min,Avg

例:查询所有图书的数目。

BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}

例:查询所有图书阅读量的总和。

BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

count函数 返回值是一个数字(作用:统计满足条件数据的数目。)

例:统计所有图书的数目。

BookInfo.objects.all().count()
BookInfo.objects.count()

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

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

小结:
在这里插入图片描述

二. 查询集

all, filter, exclude, order_by 调用这些函数会产生一个查询集QuerySet 类对象可以继续调用上面的所有函数。

查询集特性

1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。

2)缓存:当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

限制查询集

可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

取出查询集第一条数据的两种方式:

方式说明
b[0]如果b[0]不存在,会抛出IndexError异常
b[0:1].get()如果b[0:1].get()不存在,会抛出DoesNotExist异常。

exists:判断一个查询集中是否有数据。 True False

·

三. 关联查询(一对多)

查询和对象关联的数据

在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性

例:查询id为1的图书关联的英雄的信息。

b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()

通过模型类查询:

HeroInfo.objects.filter(hbook__id=1)

例:查询id为1的英雄关联的图书信息。

h = HeroInfo.objects.get(id=1)
h.hbook

通过模型类查询:

BookInfo.objects.filter(heroinfo__id=1)

格式:
在这里插入图片描述

由一类的对象查询多类的时候:

一类的对象.多类名小写_set.all() #查询所用数据

由多类的对象查询一类的时候:

多类的对象.关联属性  #查询多类的对象对应的一类的对象

由多类的对象查询一类对象的id时候:

多类的对象.关联属性_id

通过模型类实现关联查询

在这里插入图片描述

例:查询图书信息,要求图书关联的英雄的描述包含’八’。

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查询图书信息,要求图书中的英雄的id大于3.

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龙八部')

通过多类的条件查询一类的数据:

一类名.objects.filter(多类名小写__多类属性名__条件名) 

通过一类的条件查询多类的数据:

多类名.objects.filter(关联属性__一类属性名__条件名)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

此时一位小白路过

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

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

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

打赏作者

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

抵扣说明:

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

余额充值