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
posted @ 2023-03-27 22:03  mmszxc  阅读(448)  评论(0)    收藏  举报