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

数据库数据查询

195次阅读
没有评论

共计 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、短信等云产品特惠热卖中