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. 缓存功能
当遍历(迭代)访问查询集 所有数据,会缓存查询集所有数据,当再次操作该查询集中的数据时,将会使用缓存;
# 创建查询集
query_set = Department.objects.all()
# 会查询数据库
[dep.name for dep in query_set]
# 使用缓存,不再查数据库
[dep.name for dep in query_set]
如果只是访问查询集 部分数据(下标或切片)不会缓存
# 创建查询集
query_set = Department.objects.all()
# 会查询数据库
query_set[0]
# 会查询数据库
query_set[0]
django自带的orm之查询的更多相关文章
- django自带的orm增删改
# 转载请留言联系 模型管理器 模型管理器:objects属性 每个模型类默认都有一个叫 objects 的类属性,它由django自动生成 我们把 objects 称为 模型管理器,其类型为: dj ...
- Django 自带的ORM增删改查
通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...
- django自带orm妙用
django对数据库数据进行处理方式通常有以下几种方式: 1.使用原生sql对数据库进行处理:pymysql,cx_oracle 2.使用外置orm模块来对数据库进行处理:sqlalchemy 3.使 ...
- Django的ORM常用查询操作总结(Django编程-3)
Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...
- Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...
- Python - Django - ORM F查询和Q查询
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- Django之ORM优化查询的方式
ORM优化查询的方式 一.假设有三张表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room_id time_id date 1 ...
- 【Django】--Models 和ORM以及admin配置
Models 数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库 <1>sqlite django默认使用sqlite的数据库 ...
随机推荐
- 多线程&&I/O
不是操作系统的,是UNIX环境高级编程的!
- 解决hadoop 集群启动常见错误办法
hadoop 集群常见错误解决办法 hadoop 集群常见错误解决办法: (一)启动Hadoop集群时易出现的错误: 1. 错误现象:Java.NET.NoRouteToHostException ...
- BZOJ4318 OSU!(动态规划+概率期望)
设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率).暴力转移显然.前缀和优化即可. 但是这个前缀和精度无法承受,动不动就nan. 考虑增加一位的贡献.若之前后缀1的个数 ...
- [洛谷P2044][NOI2012]随机数生成器
题目大意:给你$m,a,c,X_0,n,g$,求$X_{n+1}=(a\cdot X_n+c) \bmod{m}$,最后输出对$g$取模 题解:矩阵快速幂+龟速乘,这里用了$long\;double$ ...
- GDI绘图中的映射模式CDC::SetMapMode()
原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...
- LinuxUnix time时间戳的处理转换函数
Linux/Unix time时间戳的处理转换函数 linux下的时间函数 我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年.月.日.时.分.秒,星期等),或者是隔一段时间去做某事,那 ...
- 【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP
先说一下斜率优化:这是一种经典的dp优化,是OI中利用数形结合的思想解决问题的典范,通常用于优化dp,有时候其他的一些决策优化也会用到,看待他的角度一般有两种,但均将决策看为二维坐标系上的点,并转化为 ...
- 这次OpenSSL HeartBleed漏洞是怎么一回事呢?
“心脏出血”(Heartbleed)被称为互联网史上最严重的安全漏洞之一,波及了大量常用网站.服务,包括很多人每天都在用的 Gmail 等等,可能导致用户的密码.信用卡轻易泄露.但是我们可能对它还不是 ...
- CentOS 7, 升级python到3.x
By francis_hao Apr 11,2017 使用源码安装方式 首先到官网https://www.python.org/downloads/source/ 下载python最新版本.当前 ...
- 免费的dns服务器(更换dns服务器有时可以解决某些网站(如爱奇艺访问不了的问题))
首先百度提供的dns就是非常好用的dns,小编就把百度的dns作为首选180.76.76.76. 其次是阿里提供的dns223.5.5.5,响应速度非常的快,而且没有广告劫持. 再就是最通用的 ...