zoukankan      html  css  js  c++  java
  • django自带的orm之查询

    一、filter条件查询

    用法: 模型类.objects.filter(模型类属性名__查询操作符 = 值)

    • 判等: exact

      # 例:查询id为1的员工
      select * from employee where id=1;
      Employee.objects.filter(id__exact=1)
      Employee.objects.get(id=1)
      
    • 模糊查询: contains / endswith / startswith

      # 例:查询名字包含'马'的员工
      select * from employee where name likes "%马%";
      Employee.objects.filter(name__contains="马")
      
      # 例:查询名字以'军'结尾的员工
      select * from employee where name like "%军";
      Employee.objects.filter(name__endswith="军")
      
    • 空查询: isnull

      # 例:查询备注信息不为空的员工
      select * from employee where comment is not null;
      Employee.objects.filter(comment__isnull=False)
      
    • 范围查询: in

      # 例:查询id编号为1或3或5的员工
      select * from employee where id in (1,3,5);
      Employee.objects.filter(id__in=[1,3,5])
      
    • 比较查询: gt(greater than 大于) lt(less than 小于) gte(大于等于) lte(小于等于)

      # 例:查询age大于等于30的员工
      select * from employee where age >= 30;
      Employee.objects.filter(age__gte=30)
      
    • 日期查询: year、month、day、week_day、hour、minute、second

      例:查询2015年入职的员工
      select * from employee where year(hire_date) = 2015;
      Employee.objects.filter(hire_date__year=2015)
      
      例:查询2014年1月1日后入职的员工
      select * from employee where hire_date >= "2014-1-1"
      Employee.objects.filter(hire_date__gte="2014-1-1")
      

    二、exclude方法(“不包括查询”)

    返回不满足条件的数据

    用法: 模型类.objects.exclude(条件)

    # 例:查询id不为3的员工
    select * from Employee where id !=3;
    Employee.objects.exclude(id=3)
    

    三、F对象(“对比查询”)

    如果要对比两个属性应该怎么做呢?此时要用到django的ORM的F对象,F对象是用来比较表中的两个字段,接受的参数是字段名

    用法: F('属性名')

    导包:from django.db.models import F

    # 例:查询年龄大于id的员工信息(无实际意义)
    select * from employee where age > id;
    Employee.objects.filter(age__gt=F("id"))
    
    # 例:查询年龄大于4倍id编号的员工信息(无实际意义)
    select * from employee where age > id*4;
    Employee.objects.filter(age__gt=F("id")*4)
    

    三、Q对象(“逻辑查询”)

    当我们要对查询条件进行与(&)或(|)非(~)的逻辑操作时,需要用到Q对象。

    用法: Q(条件1) 逻辑操作符 Q(条件2)

    • 与:Q(查询条件1)&Q(查询条件2)
    • 或:Q(查询条件1)|Q(查询条件2)
    • 非:~Q(查询条件2)

    导包:from django.db.models import Q

    例:查询id大于3且年龄大于30的员工信息。
    select * from employee where id > 3 and age >30;
    Employee.objects.filter(Q(id__gt=3)&Q(age__gt=30))
    Employee.objects.filter(id__gt=3,age__gt=30)  # 因为这种方法更加简单,所以查询“与”时,很少用Q对象。
    
    例:查询id大于3或者年龄大于30的员工信息。
    select * from employee where id > 3 or age > 30;
    Employee.objects.filter(Q(id__gt=3)|Q(age__gt=30))
    
    例:查询id不等于3员工信息。
    select * from employee where id != 3;
    Employee.objects.filter(~Q(id__gt=3))
    

    四、order_by方法(“排序查询”)

    对查询结果进行排序,默认是升序,也就是从小到大。

    升序: 模型类.objects.order_by('属性名') 降序: 模型类.objects.order_by('-属性名') ,注意,负号

    例:查询所有员工信息,按照id从小到大进行排序。
    select * from employee oreder by id asc;
    Employee.objects.order_by("id")
    
    例:查询所有员工信息,按照id从大到小进行排序。
    select * from employee order by id desc;
    Employee.objects.order_by("-id")
    
    例:把id大于3的员工信息, 按年龄从大到小排序显示;
    select * from employee where id > 3 order by age desc;
    Employee.objects.filter(id__gt=3).order_by("-age")
    

    五、aggregate方法("聚合查询")

    当我们需要对多行查询结果的一列进行操作,返回一个值时,这时候就需要用到聚合操作。例如一张成绩表,想要查全班的语文成绩的平均分,就是聚合操作。

    常用聚合类有:Sum,Count,Max,Min,Avg

    用法: 模型类.objects.aggregate(聚合类('模型属性'))

    from django.db.models import Sum, Count, Max, Min, Avg
    
    例:查询所有员工的平均工资
    select avg(salary) from employee;
    Employee.objects.aggregate(Avg("salary"))
    

    六、关联查询

    见我的另一篇博文:django一对多、多对多模型的建立

    拓展:

    1. 惰性查询

    • 创建查询集时不会访问数据库,操作查询集中的数据时才会访问;
    • 操作查询集指 下标、切片、迭代操作,与if合用
    # 得到查询集,不会访问数据库
    query_set = Department.objects.all()
    # 此时才访问数据库
    print(query_set[0])
    

    2. 缓存功能

    1. 当遍历(迭代)访问查询集 所有数据,会缓存查询集所有数据,当再次操作该查询集中的数据时,将会使用缓存;

       # 创建查询集
       query_set = Department.objects.all()
       # 会查询数据库
       [dep.name for dep in query_set]
       # 使用缓存,不再查数据库
       [dep.name for dep in query_set]
      
    2. 如果只是访问查询集 部分数据(下标或切片)不会缓存

       # 创建查询集
       query_set = Department.objects.all()
       # 会查询数据库
       query_set[0]
       # 会查询数据库
       query_set[0]
      
  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/chichung/p/9919581.html
Copyright © 2011-2022 走看看