Django查询
接上一节 :https://blog.youkuaiyun.com/LeeSkyRa/article/details/103758019
由于本节查询方法较多,各种查询需求也是分门别类,所以首先要对表中插入必要多的数据,所以这里准备好了必要的数据,直接插入到数据库就好,为方便查询
insert into tb_books(btitle,bpub_date,bread,bcomment,is_delete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0),
('西游记','1988-1-1',10,10,0);
insert into tb_heros(hname,hgender,hbook_id,hcomment,is_delete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0),
('孙悟空',1,5,'如意金箍棒',0),
('猪悟能',1,5,'九齿钉耙',0),
('沙悟净',1,5,'降妖宝杖',0);
pycharm 中显示数据库表效果如下图:
下面我们就进行各种高级查询:
一、过滤查询
- filter 筛选多个符合条件的数据
- exclude 排除掉符合条件剩下的数据
- get 筛选单挑数据,
下面就以 filter 为例,进行演示:
1、相等 exact
exact:表示判等。
(查询 id 为1的图书。 )
BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)
2、模糊查询
contains:是否包含。
startswith、endswith:以指定值开头或结尾。
(查询书名包含'传'的图书。 )
BookInfo.objects.filter(btitle__contains='传')
(查询书名以'部'结尾的图书 )
BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
3、空查询
isnull:是否为null。
(查询书名不为空的图书。 )
BookInfo.objects.filter(btitle__isnull=False)
4、范围查询
in:是否包含在范围内。
(查询编号为1或3或5的图书 )
BookInfo.objects.filter(id__in=[1, 3, 5])
5、比较查询
- gt 大于 (greater then)
- gte 大于等于 (greater then equal)
- lt 小于 (less then)
- lte 小于等于 (less then equal)
- exact 等于
- exclude 不等于
(查询编号大于3的图书 )
BookInfo.objects.filter(id__gt=3)
(查询编号不等于3的图书 )
BookInfo.objects.exclude(id=3)
6、日期查询
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))
二、F 对象和 Q 对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
from django.db.models import F,Q
F 对象
(查询阅读量大于等于评论量的图书。 )
BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F对象上使用算数运算。
(查询阅读量大于2倍评论量的图书。 )
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q 对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
(查询阅读量大于20,并且编号小于3的图书。 )
BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
(查询阅读量大于20的图书,改写为Q对象如下。 )
BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
(查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现 )
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q对象前可以使用~操作符,表示非not。
(查询编号不等于3的图书。 )
BookInfo.objects.filter(~Q(pk=3))
三、聚合查询
1、聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。 使用count时一般不使用aggregate()过滤器。
from django.db.models import Sum
(查询图书的总阅读量。 )
BookInfo.objects.aggregate(Sum('bread'))
(查询图书总数。 )
BookInfo.objects.count()
2、排序
使用order_by对结果进行排序
BookInfo.objects.all().order_by('bread')
BookInfo.objects.all().order_by('-bread')
四、关联过滤查询
(查询图书,要求图书英雄为"孙悟空" )
BookInfo.objects.filter(heroinfo__hname='孙悟空')
(查询图书,要求图书中英雄的描述包含"八" )
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
(查询书名为“天龙八部”的所有英雄。 )
HeroInfo.objects.filter(hbook__btitle='天龙八部')
(查询图书阅读量大于30的所有英雄 )
HeroInfo.objects.filter(hbook__bread__gt=30)