模型查询

基础查询)

  • all查询所有对象(表里的每一条记录就是一个模型类对象),返回queryset对象(query set是一个集合 他是一个数据类型对象)

      stu = Student.objects.all()
      print(stu[0].name) # 获取到query set这个集合后 可以获取里面模型对象的值
    
  • first查询第表中的第一条数据,返回一个模型类对象

      stu = Student.objects.first() # 返回一个模型类对象
      print(stu.name)
      print(stu.age)
    
  • last查询表中的最后一条数据,返回模型类对象

      stu = Student.objects.last() # 返回一个模型类对象
      print(stu.name)
      print(stu.age)
    
  • filter条件查询,相等于sql里面的where,返回一个集合query set对象

      stu = Student.objects.filter(sex="1") # 返回符合条件的query set集合对象,和sql里面的where set="1"
      stu = Student.objects.filter(sex="1",age="34") # 返回符合条件的query set集合对象,逻辑并且(and),相等于where set="1" and age="34"
      print(stu)
    
  • exclude查询符合条件以外的数据,返回一个query set集合对象

      stu = Student.objects.exclude(name="张三") # 相等于  WHERE NOT (`db_student`.`name` = '张三')
      stu = Student.objects.exclude(sex="0",age=19) # 逻辑并且, 就是排除sex="0" and age=19的记录 将其他数据全部查出来
      print(stu)
    
  • get查找符合条件的,查询结果必须只有一条符合条件的,查出多个或者0个都会报错,返回一个模型类对象

      stu = Student.objects.get(sex="0",age=19) # 逻辑并且
      print(stu)
    
  • get查找符合条件的,查询结果必须只有一条符合条件的,查出多个或者0个都会报错,返回一个模型类对象

      stu = Student.objects.get(sex="0",age=19) # 逻辑并且
      print(stu)
    
  • order_by是query set类型的一个内置方法,只要是一个queryset对象都可以调用,同样返回一个queryset

    默认升序 排序字段名称前面加上- 意思就是降序,返回还是一个query set,可以使用多个字段进行排序 优先使用第一个字短排序 如果第一个字段排序有相同的就会按照第二个给定的字段

     stu = Student.objects.all()
     print(stu.order_by("-age","-id")) 
    
  • count做计数用,count是queryset对象的内置方法,返回一个int

     stu = Student.objects.all()
     print(stu.count())
     stu = Student.objects.filter(sex="1") # 只要是一个query set对象都可以使用
     print(stu.count())
    
  • exists判断表中是否有记录

     stu = Student.objects.exists() # 返回一个布尔值 True/False
     print(stu)
    
  • value翻译成sql是select 默认查出所有字段加上values查出指定字段数据,返回以一个query set对象 集合里面放的是字典

     stu = Student.objects.all().values("name","age")
     print(stu)
     stu = Student.objects.filter(name="zhq").values("name", "age") 
     print(stu)
    
  • value_list翻译成sql是select 默认查出所有字段加上values查出指定字段数据,返回以一个query set对象 集合里面放的是元组

     stu = Student.objects.all().values_list("name","age")
     print(stu)
     stu = Student.objects.filter(name="张洪强").values_list("name", "age")
     print(stu)
    
  • distinct是queryset的一个内置方法,去重

    stu = Student.objects.all().values("age").distinct() # 去重
    print(stu) 
    print(stu)
    

更多见

模糊查询

  • __contains 是查询包含的

        stu = Student.objects.filter(name__contains="王") # name包含王的全部查出来
        print(stu)
    
  • __startswith 是查询什么开头的数据

        stu = Student.objects.filter(name__startswith="张") # 将name是张开头的全部查出来
        print(stu)
        stu = Student.objects.filter(name__endswith="四")
        print(stu)
    
  • __endswith 是查询什么结尾的数据

        stu = Student.objects.filter(name__endswith="四") # 将name是四结尾的全部查出来
        print(stu)
    
  • __isnull 是查询是否为null

      stu = Student.objects.filter(description__isnull=False) # True代表为空/False代表不为空
      print(stu)
    
  • __gt 是查询大于的

      stu = Student.objects.filter(age__gt=30)  # 将age大于30的全部查出来
      print(stu)
    
  • __gte 是查询大于等于的

      stu = Student.objects.filter(age__gte=23) # 将age大于等于23的全部查出来
      print(stu)
    
  • __lt 是查询小于的

      stu = Student.objects.filter(age__lt=23) # 将age小于23的全部查出来
      print(stu)
    
  • __lte 是查询小于等于的

      stu = Student.objects.filter(age__lte=23) # 将age小于等于23的全部查出来
      print(stu)
    
  • __range 是查询区间的

      stu = Student.objects.filter(age__range=(20,50)) # 将age20到50之前的数据全部查出来
      print(stu)
    
  • __in 是查询给定的多个值

      stu = Student.objects.filter(age__in=(22,34)) # age = 22 或者等于34
      print(stu)
    
    
  • __year 是查询查日期某一年的数据

      stu = Student.objects.filter(birthday__year="2000") # 查询birthday是2000年的所有数据
      print(stu)
    
  • __month 是查询查日期某一月的数据

      stu = Student.objects.filter(birthday__year="2000",birthday__month="10") # # 查询birthday是2000年10月的所有数据
      print(stu)
    
    

更多见

进阶查询

  • F() 查属性和属性对比

      from django.db.models import F
      stu = Student.objects.filter(gongji__gt=F("fangyu")) # 查询gongji 大于 防御的所有值
      print(stu)
    
  • Q() 做逻辑判断

      from django.db.models import Q
      stu = Student.objects.filter(Q(age__gt=23) | Q(sex=0)) # 查询age 大于23 或者 sex=0的数据,Q使用方法Q() | Q()
      print(stu)
    
  • Q() 做逻辑判断

      from django.db.models import Q
      stu = Student.objects.filter(~Q(age__gt=23)) # 查询age 不大于23 ,Q使用方法Q()
      print(stu)
    
  • Q() 做逻辑判断

      from django.db.models import Q
      stu = Student.objects.filter(Q(age__gt=23) & Q(sex=0)) # 查询age 大于23 并且 sex=0的数据
      print(stu)
    

集合函数

  • Avg 求平均值,返回一个字典

      from django.db.models import Avg
      stu = Student.objects.aggregate(age_avg=Avg("age")) # 不给age_avg变量名 返回的字典的键是默认的 给定就用给定的age_avg
      print(stu)
    
  • Sum 求和,返回一个字典

      from django.db.models import Avg,Sum,Max,Min,Count
      stu = Student.objects.aggregate(age_sum=Avg("age")) # 不给age_sum变量名 返回的字典的键是默认的 给定就用给定的age_sum
      print(stu)
    
  • Max 求最大值,返回一个字典

      from django.db.models import Max
      stu = Student.objects.aggregate(age_max=Max("age"))# 不给age_max变量名 返回的字典的键是默认的 给定就用给定的age_max
      print(stu)
    
  • Min 求最大值,返回一个字典

      from django.db.models import Min
      stu = Student.objects.aggregate(age_min=Min("age"))# 不给age_min变量名 返回的字典的键是默认的 给定就用给定的age_min
      print(stu)
    
  • Count 求最大值,返回一个字典

      from django.db.models import Count
      stu = Student.objects.aggregate(age_count=Avg("age"))# 不给age_count变量名 返回的字典的键是默认的 给定就用给定的age_count
      print(stu)
    

分组

  • annotate 分组,返回一个query set对象集合
      stu = Student.objects.values("sex").annotate(gongji=Avg("gongji")) # annotate 前面加上values是分组的作用 就是根据哪个字短分组 annotate进行在过滤 求平均值
      print(stu)
    

原生sql

  • raw 可以直接写sql,返回一个quest set子类Raw Query Set
          stu = Student.objects.raw("select * from db_student") # 返回query set对象里面嵌套模型类
          print(stu)
          for x in stu:
              print(x)
    
posted @ 2022-11-30 19:47  zhq9  阅读(17)  评论(0编辑  收藏  举报