1、基本查询
--在数据库中一般是 读写比 10:1,所以查询操作数远远大于插入、删除、更新等数据库操作数
1、基础查询 -- 查询一条数据
from book.models import BookInfo, PeopleInfo
try:
book = BookInfo.objects.get(id=1)
print(book.read_count)
except BookInfo.DoesNotExist:
pass
[注:]这种取数据如果不存在会报异常,这样的话会有问题,所以上面加上了异常处理
book.models.BookInfo.DoesNotExist: BookInfo matching query does not exist.
2、基础查询 -- 查询一张表中所有结果
book = BookInfo.objects.all()
查询结果:
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: dhin>, <BookInfo: java>]>
3、基础查询 -- 统计一张表中所有数据
--两种方式都可以查出数据总数:
BookInfo.objects.all().count()
BookInfo.objects.count()
2、django ORM框架中:filter get exclude三个函数,相当于数据库中where查询
select * from bookinfo where * # 数据库查询
=== 上面数据库语句 等价于 下面django ORM框架
filter : 筛选过滤 返回N个结果 (查询结果的数量 = 0/1/2/3 ... n-2/n-1/n)
get : 返回一个结果
exclude : 排除掉 符合条件的 所有结果,相当于not 和 filter正好结果互补
语法形式:
属性名称__比较运算符=值
****************************************************************************************
--比较运算符:exact # 表示精确等于
# 查询编号为1的图书
BookInfo.objects.get(id__exact=1) # 属性 id + 比较运算符 exact[ 等于 ]
BookInfo.objects.get(id=1) # 简写形式
[结果:] <BookInfo: 射雕英雄传>
BookInfo.objects.filter(id__exact=1) # 属性 id + 比较运算符 exact[ 等于 ]
BookInfo.objects.filter(id=1) # 简写形式
[结果:] <QuerySet [<BookInfo: 射雕英雄传>]>
BookInfo.objects.filter(id__exact=1)[0] # 按照列表的格式取数据就好
[结果:] <BookInfo: 射雕英雄传>
--比较运算符:contains 表示包含某一个独特的字符
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')
--比较运算符:endswith # 以什么结尾
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='传')
--比较运算符:isnull # 判断是否为空
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
--比较运算符:in # 根据某一些特定值选取数据
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 2, 5])
--比较运算符:大于 大于等于 小于 小于等于
# gt greater than 大于
# gte greater than equal 大于等于
# lt less than 小于
# lte less than equal 小于等于
# 查询编号大于3的图书
BookInfo.objects.filter(id__gt=2)
--比较运算符:剔除某一个值,记住exclude是可以像filter一样随意使用比较运算符的,所以请尽情发挥你的想象力
# 查询书籍编号不为2的
BookInfo.objects.exclude(id=2)
BookInfo.objects.exclude(id__in=[2, 1, 3])
--比较运算符:date_time类型的数据格式,可以使用像 year day这样的特殊的比较运算符,其他的相关运算符请自行查看
# 查询1980年发表的图书
BookInfo.objects.exclude(pub_date__year='1980')
--比较运算符:时间比较越大,说明越早 即 1990 > 2000
# 查询1990年1月1日后发表的图书
BookInfo.objects.exclude(pub_date__lt='1990-1-1')
3、F对象:两个属性之间的比较,区别于Q对象的联合查询
--两个属性之间的比较:
比如说一个楼房:高度 和 地下深度 两个属性之间比较,都是数字可以比较。在计算机中可以比较是指数据类型是否一致,至于其实际意义不在考虑中,比如说占地面积 和 高度 实际单位不一致但是计算机比较起来没有任何问题
--上面的解释其实就是对数据进行初步多维度筛选的一个缩影,也就是我们这里所用到的F对象
--语法:
from django.db.models import F
F(属性名)
--案例:
from django.db.models import F
BookInfo.objects.filter(read_count__gt=F('comment_count')) # 查询阅读数 大于 评论数的书籍
BookInfo.objects.filter(read_count__gt=F('comment_count')*2) # 查询阅读数 大于 评论数2倍的
4、Q对象
--select from where ** and ** 实现方式,filter级联 和 Q对象都可以
--查询 id 大于 2 且 comment_count 大于 20的书籍
--方式1:filter().filter().*** 的形式
BookInfo.objects.filter(id__gt=1).filter(comment_count__gt=20)
--方式2:filter(条件1, 条件2, ***)
BookInfo.objects.filter(id__gt=1, comment_count__gt=20)
--上述情况是在 and 条件下的select查询,如果此时条件换成 or,则不能满足要求。因此使用Q对象势在必得
--Q对象语法:
Q对象可以使用&、|连接
-- &表示逻辑与
-- |表示逻辑或
-- ~表示 非
--Q对象使用案例:
--from django.db.models import Q
-- BookInfo.objects.filter(Q(read_count__gt=20)&Q(id__lt=4)) # 查询 阅读数大于 20 或者 id 小于 4 的书籍
-- BookInfo.objects.filter(Q(read_count__gt=20)|Q(id__lt=3)) # 查询 阅读数 大于 20 且 id 小于 3 的书籍
--BookInfo.objects.filter(~Q(id=3)) # 查询 id不为3 的书籍
--BookInfo.objects.exclude(id=3) # 查询 id不为3 的书籍
5、聚合查询 -- 聚合函数 Sum , Max , Min , Avg , Count
--常见的聚合函数有 5 个。这里作为举例,后续深入或者用到了请自行查询:
sum max min avg count
--语法:
使用aggregate()过滤器调用聚合函数,被定义在django.db.models中
--使用案例:
导入聚合函数 Sum , Max , Min , Avg , Count
--from django.db.models import Sum , Max , Min , Avg , Count
--BookInfo.objects.aggregate(Sum('read_count')) # 阅读数量汇总统计
--BookInfo.objects.aggregate(Sum('comment_count')) # 评论数量汇总统计
6、排序函数
# 默认升序
>>> BookInfo.objects.all().order_by('read_count')
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 笑傲江湖>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>
# 降序
>>> BookInfo.objects.all().order_by('-read_count')
<QuerySet [<BookInfo: 雪山飞狐>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄传>]>
7、关联查询