阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

数据库数据查询

376次阅读
没有评论

共计 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})
    • 比较运算符

      1. __gt 大于
      2. __gte 大于等于
      3. __lt 小于
      4. __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
  • 注意

    要获取的数据超过限制集合中的个数,能拿多少算多少

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计4834字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7799132
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...