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]
      
  • 相关阅读:
    WebSerivce之使用AXIS开发(转自勇哥的BLOG)
    Apusic如何配置虚拟主机
    webservice之使用axis+spring开发(转自勇哥的BLOG)
    HP UX常用维护配置文件(转)
    Apache+Apusic集成配置负载均衡
    人员招聘与日常培训
    HP_UX常用指令列表(转,整理过,方便使用)
    Apusic ESB之我见
    VI常用指令列表(转,根据需要做过修改)
    ACM HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/chichung/p/9919581.html
Copyright © 2011-2022 走看看