一、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]

django自带的orm之查询的更多相关文章

  1. django自带的orm增删改

    # 转载请留言联系 模型管理器 模型管理器:objects属性 每个模型类默认都有一个叫 objects 的类属性,它由django自动生成 我们把 objects 称为 模型管理器,其类型为: dj ...

  2. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  3. django自带orm妙用

    django对数据库数据进行处理方式通常有以下几种方式: 1.使用原生sql对数据库进行处理:pymysql,cx_oracle 2.使用外置orm模块来对数据库进行处理:sqlalchemy 3.使 ...

  4. Django的ORM常用查询操作总结(Django编程-3)

    Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...

  5. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  6. Python - Django - ORM F查询和Q查询

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  7. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  8. Django之ORM优化查询的方式

    ORM优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 ...

  9. 【Django】--Models 和ORM以及admin配置

    Models 数据库的配置 1    django默认支持sqlite,mysql, oracle,postgresql数据库 <1>sqlite django默认使用sqlite的数据库 ...

随机推荐

  1. DFS(3)——poj1321棋盘问题

    一.题目回顾 题目链接:棋盘问题 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于 ...

  2. EasyUI 布局 - 动态添加标签页(Tabs)

    首先导入js <link rel="stylesheet" href="../js/easyui/themes/default/easyui.css"&g ...

  3. 第四次JAVA作业

    public class TvbDog { public static void main(String[] args) {  Dog per=new Dog("陈狗"," ...

  4. [剑指Offer] 6.旋转数组的最小数字(二分法)

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  5. 【SVN】SVN服务器的本地搭建和使用

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  6. ElasticSearch1.7.1拼音插件elasticsearch-analysis-pinyin-1.3.3使用介绍

    ElasticSearch拼音插件elasticsearch-analysis-pinyin使用介绍 https://my.oschina.net/xiaohui249/blog/214505 摘要: ...

  7. [CF1076E]Vasya and a Tree

    题目大意:给定一棵以$1$为根的树,$m$次操作,第$i$次为对以$v_i$为根的深度小于等于$d_i$的子树的所有节点权值加$x_i$.最后输出每个节点的值 题解:可以把操作离线,每次开始遍历到一个 ...

  8. 【CF MEMSQL 3.0 B. Lazy Security Guard】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  9. 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...

  10. HDU1151:Air Raid(最小边覆盖)

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...