Django查询

Django查询

接上一节 https://blog.csdn.net/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:是否包含。

startswithendswith:以指定值开头或结尾。

查询书名包含'传'的图书。

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、日期查询

yearmonthdayweek_dayhourminutesecond:对日期时间类型的属性进行运算。

(查询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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值