组团学

数据库数据查询

阅读 (300281)

一、数据查询名词解析

  • 查询集

    从数据库中获取数据的集合

  • 原始查询集

    调用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
  • 注意

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

需要 登录 才可以提问哦