共计 4834 个字符,预计需要花费 13 分钟才能阅读完成。
一、数据查询名词解析
-
查询集
从数据库中获取数据的集合
-
原始查询集
调用 get_queryset 得到的查询集称为原始查询集,不作为数据的提取
-
数据查询集
在原始查询集上或数据查询集上调用过滤器得到数据查询集
-
过滤器
基于过滤器函数的参数进行条件过滤
SQL 的角度来说,查询集等价于 select,过滤器等价于 where、limit 子句
过滤器就是一个函数 根据所给的参数 限制返回的查询集
可以使用链式语法规则(User.objects.all().filter().filter())
-
惰性执行
-
创建查询集不会操作数据库,直到调用数据时才会与数据库进行交互
-
访问数据库
与 if 合用
迭代
列化
求值
-
二、返回查询集的过滤器
-
all()
作用:获取全部数据
格式:类名.objects.all()
def allView(req): u = User.objects.all() print(u) return render(req,'show.html',{'data':u})
-
filter()
作用:过滤掉符合条件的数据
def filterView(req): u = User.objects.filter(sex=True,username__contains='1') u = User.objects.filter(sex=True).filter(username__contains='1') return render(req,'show.html',{'data':u})
-
exclude()
作用:过滤掉符合条件的数据
def excludeView(req): u = User.objects.exclude(sex=True,username__contains='l') u = User.objects.exclude(sex=True).exclude(username__contains='1') return render(req,'show.html',{'data':u})
-
order_by()
作用:根据字段进行排序
格式
- order_by(‘field’) 升序
- order_by(’-field’) 降序
def orderByView(req): u = User.objects.filter().order_by('-id') u = User.objects.order_by('-id') u = User.objects.order_by('id') return render(req,'show.html',{'data':u})
-
values()
作用:返回一个列表 每条数据是一个字典
格式
- values() 返回所有字段和值
- values(field1,field2…) 只返回给定字段的值
def valuesView(req): u = User.objects.values() # 默认返回所有 u = User.objects.values('id','age') # 只返回 id 和 age 字段的值 print(u) #[{'username':'张三','age':18}] return render(req,'show.html',{'data':u}
-
extra()
作用:实现别名操作
格式
- extra()
- extra(select={new:ord})
res = User.objects.all().extra(select={'name':'username'}) # 将 username 字段起别名为 name print(res[0].name) print(res[0].username)
三、返回单个值的过滤器
-
get()
作用:返回单个满足条件的对象
格式:类名.objects.get(属性 = 值)
注意
- 如果未找到会引发“模型类.DoesNotExist”异常
- 如果多条被返回,会引发“模型类.MultipleObjectsReturned”异常
def myGet(req): u = User.objects.get(pk=1) print(u) u = User.objects.get(id=1) print(u) # 报错 原因:只能返回一个值 但是匹配到了多个 MultipleObjectsReturned u = User.objects.get(age=43) # 报错 DoesNotExist 匹配失败 u = User.objects.get(id=20) print(u) return HttpResponse('get')
-
count()
作用:返回当前查询集中的数据条数
def countView(req): # 查询数据所有条数 u = User.objects.count() # 筛选性别为 True 的数据条数 u = User.objects.filter(sex=True).count() print(u) return HttpResponse('返回数据的条数')
-
first()
作用:返回查询集中的第一个对象
def firstView(req): # 第一条 u = User.objects.order_by('id').first() print(u) return HttpResponse('first')
-
last()
作用:返回查询集中的最后一个对象
def lastView(req): # 最后一条 u = User.objects.order_by('id').last() print(u) return HttpResponse('last')
-
exists()
作用:判断筛选条件结果是否存在
def existsView(req): # 查询年龄为 400 的数据是否存在 u = User.objects.filter(age=400).exists() print(u) return HttpResponse('exists')
四、字段查询
-
概述
实现 where 子句,作为 filter、exclude、get 等参数
-
语法
-
属性名__比较运算符 = 值_
-
对于外键
需要使用“外加属性_id”表示外键
-
% 的使用
like 语句中使用了 %,匹配数据中的 % 与,在过滤器中可以直接使用 %
filter(title__contains=’%’) where title like‘%%%’
-
-
比较运算符
-
exact
作用:表示判等,大小写敏感,如果“比较运算符”没有写,就表示判等
def exactView(req): u = User.objects.filter(username__exact='LUCKY') u = User.objects.filter(username__exact='lucky') return render(req,'show.html',{'data':u})
-
contains
作用:包含,大小写敏感
def containsView(req): u = User.userobj.filter(username__contains='LUCKY') u = User.userobj.filter(username__contains='lucky') return render(req,'show.html',{'data':u})
-
startswith、endswith
作用:以 value 开头或结尾,大小写敏感
# 以... 作为开头和结尾 def startendView(req): u = User.objects.filter(username__startswith='a') u = User.objects.filter(username__startswith='A') u = User.objects.filter(username__endswith='a') u = User.objects.filter(username__endswith='A') u = User.objects.filter(username__startswith='5',username__endswith='5') return render(req,'show.html',{'data':u})
-
iexact、icontains、istartswith、iendswith
作用:前面加个 i,表示不区分大小写
-
null
作用:查询数据是否为空
# 查询为空的 def null(req): # 查询为 null 的数据 u = User.objects.filter(username__isnull=True) u = User.objects.filter(username=None) # 查询不为 null 的数据 u = User.objects.exclude(username__isnull=True) u = User.objects.filter(username__isnull=False) return render(req,'show.html',{'data':u})
-
in
作用:是否包含范围内
def In(req): # 在... 范围内 u = User.objects.filter(id__in=[1,2,3,4]) # 查询 id 为 1 2 3 4 的数据 u = User.objects.filter(pk__in=[1,2,3,4]) # 查询主键为 1 2 3 4 的数据 # 不在... 范围内 u = User.objects.exclude(pk__in=[1,2,3,4]) # 查询主键不为 1 2 3 4 的数据 return render(req,'show.html',{'data':u})
-
比较运算符
- __gt 大于
- __gte 大于等于
- __lt 小于
- __lte 小于等于
示例
# 比较运算符 def compare(req): u = User.objects.filter(id__gt=2) # 查询 id 大于 2 的数据 u = User.objects.filter(id__gte=2) # 查询 id 大于等于 2 的数据 u = User.objects.filter(id__lt=5) # 查询 id 小于 5 的数据 u = User.objects.filter(id__lte=5) # 查询 id 小于等于 5 的数据 u = User.objects.filter(id__exact=5) # 查询 id 等于的数据 u = User.objects.exclude(id__exact=5) # 查询 id 不等于的数据 return render(req,'show.html',{'data':a})
-
五、聚合函数
-
导入
from django.db.models import Avg,Max,Min,Sum,Count
-
aggregate()
返回聚合的值
-
方法
- Avg 平均数
- Max 最大
- Min 最小
- Sum 求和
- Count 统计
-
示例
from django.db.models import Avg,Count,Sum,Max,Min # 聚合函数 def jhView(req): u = User.objects.aggregate(Avg('age')) # 求平均年龄 u = User.objects.aggregate(Sum('age')) # 求年龄总和 u = User.objects.aggregate(Max('age')) # 求最大年龄 u = User.objects.aggregate(Min('age')) # 求最小年龄 u = User.objects.aggregate(Count('age')) # 求年龄数据条数 return HttpResponse('值为 {}'.format(u))
六、限制查询机制
-
原理
查询集是一个列表,可以使用下标的方式进行限制,等同于 mysql 中的 limit 和 offset 子句
-
注意
下标不能为负数
-
格式
- [下标]
- [头下标: 尾下标]
- [: 尾下标]
- [头下标:]
- [:: 步长]
-
示例
u = User.objects.all()[0] # 获取索引为 0 的数据 u = User.objects.all()[:2] # 获取前俩条数据 u = User.objects.all()[0:] # 获取所有数据 u = User.objects.all()[::2] # 获取步长为 2 数据
-
异常
- IndexError
- AssertionError
-
注意
要获取的数据超过限制集合中的个数,能拿多少算多少