条件查询
参数说明
BookInfo:为图书模型表 id主键, btitle书名, bpup_date出版日期, bread阅读量, bcomment评论量
HeroInfo为英雄模型表 hanme英雄名字, hgender性别, hcomment描述, hbook关联图书表的外键
- 基本查询
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
2.过滤查询
2. filter 过滤出多个结果
3. exclude 排除掉符合条件剩下的结果
4. get 过滤单一结果
过滤条件的表达语法如下:
属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
5. exact:表示判等。
查询编号为1的图书
BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)
6. 模糊查询
contains:是否包含。(说明:如果要包含%无需转义,直接写即可)
例1:查询书名包含'传'的图书
BookInfo.objects.filter(btitle__contains='传')
例2:startswith、endswith:以指定值开头或结尾。
BookInfo.objects.filter(btitle__endswith='部')
`以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.`
7. 空查询
isnull:是否为null。
查询书名不为空的图书
BookInfo.objects.filter(btitle__isnull=False)
8. 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 3, 5])
9. 比较查询
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)
例:查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
BookInfo.objects.exclude(id=3)
10. 日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
条件查询
# 查询id为1的图书
books = BookInfo.objects.get(id=1)
# 查询书名包含'传'的图书
books = BookInfo.objects.filter(btitle__contains='bu') # QuerySet查询集类型
# 查询书名不为空的图书
books = BookInfo.objects.filter(btitle__isnull=False)
# 查询编号为1,3,5的图书
books = BookInfo.objects.filter(id__in=(1, 3, 5))
# 查询编号大于3的图书
books = BookInfo.objects.filter(id__gt=3)
# 查询编号不等于3的图书
books = BookInfo.objects.exclude(id=3)
# 查询1980年发表的图书
books = BookInfo.objects.filter(bpub_date__year=1980)
# 查询1980.1.1日后发表的图书
books = BookInfo.objects.filter(bpub_date__gt='1980-1-1')
F对象和Q对象
F对象用于对象之间属性的比较 F(属性名)
Q对象用于对象之间逻辑关系处理, Q(属性名__运算符=值) ,
多个过滤器逐个调用表示逻辑与关系,
同sql语句中where部分的and关键字。
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
Q对象前可以使用~操作符,表示非not。
# F对象:查询时字段之间的比较
from django.db.models import F, Sum
# 查询阅读量大于评论量的图书
books = BookInfo.objects.filter(bread__gt=F("bcomment"))
# 查询阅读量大于2倍评论量的图书(可以在F对象上使用算数运算)
books = BookInfo.objects.filter(bread__gt=F("bcomment")*2)
# Q对象,用于多个条件之间逻辑判断 且& 或| 非~
from django.db.models import Q
# Q对象,查询阅读量大于20,并且编号小于3的图书
books = BookInfo.objects.filter(bread__gt=20, id__lt=3)
books = BookInfo.objects.filter(Q(bread__gt=20) & Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书
books = BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=3))
# 查询编号不等于3的图书
books = BookInfo.objects.filter(~Q(id=3))
聚合函数 Sum Count Avg Max Min
使用aggregate()过滤器调用聚合函数。
聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
注意:aggregate的返回值是一个字典类型,格式如下
{‘属性名__聚合类小写’:值} 如:{‘bread__sum’:3}
# 聚合函数 Count Sum Avg Max Min 聚合函数需要和aggregate函数配合使用
from django.db.models import Count, Sum, Avg, Max, Min
# 查询图书的总阅读量
books = BookInfo.objects.aggregate(Sum('bread')) # {'bread__sum': 136}
# 查询图书总数(使用count时一般不使用aggregate()过滤器, 注意count函数的返回值是一个数字)
books = BookInfo.objects.count()
books = BookInfo.objects.aggregate(Count('id')) # {'id__count': 5}
# 排序 使用order_by对结果进行排序
# 对所有图书按照阅读量从小到大排序 > 升序
books = BookInfo.objects.order_by('bread')
# 对所有图书按照阅读量从大到小排序 > 降序
books = BookInfo.objects.order_by('-bread')
关联查询
由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set 例
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名 例:
h = HeroInfo.objects.get(id=1)
h.hbook
访问一对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
例:h = HeroInfo.objects.get(id=1)
h.hbook_id
关联过滤查询
由多模型类条件查询一模型类数据:
语法: 关联模型类名小写__属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于
由一模型类条件查询多模型类数据:
语法: 一模型类关联属性名__一模型类属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
# 关联查询
# 1.查询要求图书英雄人物为'孙悟空',
books = BookInfo.objects.filter(heroinfo__hname = '孙悟空')
# 2.查询图书,要求图书中英雄描述包含'八'
heros = BookInfo.objects.filter(heroinfo__hcomment__contains='八')
# 3.查询书名为'天龙八部的所有英雄'
heros = HeroInfo.objects.filter(hbook__btitle='天龙八部')
# 4.查询图书阅读量大于30的所有英雄
heros = HeroInfo.objects.filter(hbook__bcomment__gt=30)
# 关联查询 查询和对象关联对象查询
# 1.查询id为1的图书关联的英雄人物信息
heros = HeroInfo.objects.filter(hbook_id=1)
books = BookInfo.objects.get(id=1)
heros1 = books.heroinfo_set.all()
# 2.查询和西游记有关的英雄人物信息
books = BookInfo.objects.get(btitle='西游记')
heros = books.heroinfo_set.all()
# 3.查询和id为1的英雄人物关系的图书信息
heros = HeroInfo.objects.get(id=1)
books = heros.hbook
# 4.查询和孙悟空关联的图书信息
heros = HeroInfo.objects.get(hname='孙悟空')
books = heros.hbook
更新数据 修改和删除
修改更新有两种方法 save update
1)save
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname=‘猪八戒’)
hero.hname = ‘猪悟能’
hero.save()
2)update
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname=‘沙悟净’).update(hname=‘沙僧’)
删除
1.模型类对象delete
hero = HeroInfo.objects.get(id=13)
hero.delete()
- 模型类.objects.filter().delete()
HeroInfo.objects.filter(id=14).delete()
# 更新数据
# 每次只能更新一条数据
heros = HeroInfo.objects.get(id=19)
heros.hname = '猪悟能'
heros.save()
# 返回更新的行数,可以进行多行同时更新
heros = HeroInfo.objects.filter(hname="沙悟净").update(hname="沙僧")
print(heros)
# 删除
heros = HeroInfo.objects.get(id=13)
heros.delete()
HeroInfo.objects.filter(id=15).delete()
补充
查询集
1.概念
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据。
order_by():对结果进行排序。
对查询集可以再次调用过滤器进行过滤,如
BookInfo.objects.filter(bread__gt=30).order_by(‘bpub_date’)
也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
2.两大特性
1)惰性执行
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集qs
qs = BookInfo.objects.all()
继续执行遍历迭代操作后,才真正的进行了数据库的查询
for book in qs:
print(book.btitle)
2)缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询
示例:获取第1、2项,运行查看。
qs = BookInfo.objects.all()[0:2]


本文详细介绍了Django中对mysql数据库的查询操作,包括条件查询、F对象和Q对象的使用、聚合函数如Sum、Count、Avg、Max和Min的应用,以及如何进行关联查询。此外,还涵盖了数据更新、删除的方法,强调了查询集的惰性执行和缓存特性,并展示了如何限制查询集的结果数量。

1569

被折叠的 条评论
为什么被折叠?



