009 Django -ORM之模糊查找
目录
ORM 之 模糊查询
1、字符匹配查询
# 等于 SQL 中的like
# 开头
# models.Student.objects.filter(name__startswith='小')
# 结尾
# models.Student.objects.filter(name__endswith='小')
# 包含
# models.Student.objects.filter(name__contains='小')
# info = models.Student.objects.filter(age__isnull=True)
# info = models.Student.objects.filter(age__isnull=True)
# 查询 你个字段是否为null ,True 查询为空的记录,False查询不为空的记录
2 、大小查询
# gt 大于 lt 小于 gte大于等于 lte小于等于
# info = models.Student.objects.filter(age__gt=20)
# info = models.Student.objects.filter(age__gt=20)
3、范围查询
# 查询范围的 range =[20,30]
# info = models.Student.objects.filter(age__range=[20,30])
4、in 语法查询
# 查询多个值的性能高的做法,使用in
# info = models.Student.objects.filter(age__in=[22, 30,31])
5、日期查询
# 日期的筛选 匹配日期的关键字 年月日星期
info = models.Student.objects.filter(brithday__year=2008,brithday__month=12,brithday__day=12)
6、 多个字段的值对比 F函数
# 逻辑判断
from django.db.models import F,Q
# 使用 F 包裹另一个字段的值,相互对比
# 两个字段的数据相互比较的, 语文成绩大于 数学成绩 lt 小于
# info = models.Student.objects.filter(chinese_score__gt = F('math_score'))
# 两个字段的数据相互比较的, 语文成绩大于 数学成绩的 且 语文成绩最高的
info = models.Student.objects.filter(chinese_score__gt = F('math_score')).order_by('-chinese_score')
print(info)
return HttpResponse('模糊查询成功')
7、与或非逻辑表达 Q函数
与或非的表达,
与 & sql中是and
或 | sql中 or
非 -破折号, sql中 not,
from django.db.models import F,Q
# 使用 F 包裹另一个字段的值,相互对比
# 两个字段的数据相互比较的, 语文成绩大于 数学成绩 lt 小于
# info = models.Student.objects.filter(chinese_score__gt = F('math_score'))
# 两个字段的数据相互比较的, 语文成绩大于 数学成绩的 且 语文成绩最高的
# info = models.Student.objects.filter(chinese_score__gt = F('math_score')).order_by('-chinese_score')
# 表达 多个条件
#判断学生年龄大于22岁,且语文成绩大于90分的
# info = models.Student.objects.filter(age__gt=21,chinese_score__gt=90)
# 使用 Q函数包裹 字段的查询条件,使用关系对照符号 链接
# 判断学生年龄大于22岁,且语文成绩大于90分的 并且
# info = models.Student.objects.filter(Q(age__gt=21)&Q(chinese_score__gt=90))
# 判断学生任一一科成绩不及格的 或者
# info = models.Student.objects.filter(Q(chinese_score__lt=60) | Q(math_score__lt=60))
# filter内部 可以多个Q对象之间链接字段比较, 单表范围内的查询
# 判断学生任一一科成绩不及格的 并且 显示所有的男生
info = models.Student.objects.filter(Q(Q(chinese_score__lt=60) | Q(math_score__lt=60))&Q(sex=0))
# 判断学生任一一科成绩不及格的 并且 显示所有的女生 ~ 取反
info = models.Student.objects.filter(Q(Q(chinese_score__lt=60) | Q(math_score__lt=60))&~Q(sex=0))
print(info)
return HttpResponse('模糊查询成功')
8 聚合函数
from django.db.models import Sum,Count,Max,Min,Avg
'''
Sum 求和函数
Count 统计函数
Max 最大
Min 最小
Avg 平均值
'''
# 统计学生的平均年龄
# 定义平均值的key名称 等于 SQL中的 avg(age) as all_class_age_avg
# info = models.Student.objects.aggregate(all_class_age_avg = Avg('age'))
# 统计学生的语文成绩最高的
info = models.Student.objects.aggregate(Chinese_Max_score = Max('chinese_score'))
print(info)
9、分组统计函数
以一个共同属性的值,为分组依据,统计相关非唯一值字段 就是分组的概念
SQL范例
-- 查询男生和女生的 各自的人数之和
SELECT sex ,COUNT(sex) as number from test.db_student GROUP BY sex;
-- 查询男生的平均语文成绩 女生的平均语文成绩
SELECT sex ,AVG(chinese_score) from test.db_student GROUP BY sex;
ORM # 查询男生的平均语文成绩 女生的平均语文成绩
关键字 values() 获取一个字段的数据,代表group_by
models.Student.objects.values('sex')
# 以性别进行分组,把sex 字段的数据集合到容器内。
<QuerySet [{'sex': 1}, {'sex': 1}, {'sex': 0}, {'sex': 0}]>
info = models.Student.objects.values('sex').annotate(score_ch=Avg('chinese_score'))
print(info)
# 返回值 query-set ,元素是 字典 分组字段的名:统计的名称
# < QuerySet[{'sex': 1, 'score_ch': 93.5}, {'sex': 0, 'score_ch': 79.5}] >
return HttpResponse('模糊查询成功')
# 统计不同班级的语文成绩
info = models.Student.objects.values('classmeta').annotate(score_chi = Avg('chinese_score'))
<QuerySet [{'classmeta': '开发班', 'score_chi': 73.5}, {'classmeta': '运维部', 'score_chi': 99.0}, {'classmeta': '测试班', 'score_chi': 100.0}]>
10、原生执行SQL raw
# 原生的SQL 返回,只能循环取出。
info = models.Student.objects.raw("SELECT * from test.db_student")
for item in info:
print(item)
小三 18
小四 22
小五 88
小刘 22
浙公网安备 33010602011771号