Django的ORM查询操作:
  查询数据库操作是一个非常重要的技术。在Django中,查询一般就是使用filter、exclude、get三个方法来实现,在调用这些方法的时候传递不同的查询条件来实现复杂的查询需求。
  在mysql中,想要查询数据,就需要使用where关键字加上字段符合的条件去查询,在Django的orm之中,我们使用filter、exclude、get这些函数加上查询条件(field+__+condition)作为关键词去查询,现在我们就来介绍一下这里的condition:

  1、exact:精确查询,在mysql数据库中相当于"="(如果值是None,这里就相当于is null),在这里要说明的是这个查询关键字在windows上是大小写不敏感的,其实此时加不加__exact时都一样,在Linux上当mysql的collation排序规则是utf8_bin的时候是大小写敏感的,其他时候也是大小写不敏感的:
  article = Article.objects.filter(id__exact=1)
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` = 1

  2、iexact:在mysql中相当于'like'模糊查询,但是在这里值的前后不会加上%,其实也就相当于exact,这里同样也是大小写不敏感的
  article = Article.objects.filter(id__iexact=1)
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` LIKE 1

  3、contains:在mysql中相当于'like'模糊查询,但是在这里值的前后都会加上%,意思是要查询的字段中是否包含某个字符串,这个条件过滤时是大小写敏感的,也就是转化成原生SQL的时候会在值的前面加上BINARY关键字:
  article = Article.objects.filter(title__contains='钢铁')
  原生的SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE BINARY %钢铁%

  4、icontains:用法和contains一样,这是在这里大消息是不敏感的
  article = Article.objects.filter(title__icontains='钢铁')
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE %钢铁%

  5、in:在mysql中对应的也是in,用于判断查询的字段在不在某个可迭代对象中,这个可迭代对象可以是一个列表,也可以是一个元祖,当然也可以是一个queryset对象
  article = Article.objects.filter(id__in=[1,2,3])
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` IN (1, 2, 3)

  6、gt/gte/lt/lte:大于/ 大于等于/ 小于/ 小于等于
  articles = Article.objects.filter(id__gte=2)
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`id` >= 2

  7、startswith/istartswith:以某个字符串开头,在mysql中其实也是使用like关键字,只不过值的后边加上%表示任意其他的字符串,所以这也就是查询以特定字符串开头,  startswith是大小写敏感的,istartswith则是大小写不敏感的
  articles = Article.objects.filter(title__startswith='hello')
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`title` LIKE BINARY hello%

  8、endswith/iendswith:以某个字符串结尾,用法与startswith/istartswith相同,这里就不赘述了

  9、range:对应到mysql数据库时,使用的是between... and...关键字。传递一个两个元素的元祖,用来查询字段的值介于元祖的两个元素之间的对象,元祖的两个值可以是数字,此时用来过滤数值型的字段。当然元祖的两个元素也可以是一个时间,此时则用于过滤时间类型的字段,示例代码如下:

  sTime = make_aware(datetime(year=2018,month=7,day=11,hour=10,minute=0,second=0))
  eTime = make_aware(datetime(year=2018,month=7,day=11,hour=11,minute=0,second=0))
  articles = Article.objects.filter(create_time__range=(sTime,eTime))
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` BETWEEN 2018-07-11 02:00:00 AND 2018-07-11 03:00:00

  10、date:过滤符合条件的年月日,如果再设置文件中设定了USE_TZ=True,那么在查询的时候orm会使用CONVERT_TZ把数据库里的UTC时间转换为你所设定的TIME_ZONE时区的时间,然后再与你的值进行比较查询。当然在mysql中默认是没有这些时区信息的,想要完成时区转换你就必须要为你的数据库添加能处理时区信息的功能,这个功能具体添加如下,访问http://dev.mysql.com/downloads/timezones.html,下载timezone_2018e_posix.zip压缩文件,将这个压缩文件中的文件解压后复制到mysql数据库的mysql文件夹中,重启mysql服务,这样mysql就可以处理时区的转换问题了。当然如果你的配置文件中设置了USE_TZ=False,那么就不需要转换时区了。
  articles = Article.objects.filter(create_time__date=datetime(year=2018,month=7,day=11))
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE DATE(CONVERT_TZ(`article`.`create_time`, 'UTC', 'Asia/Shanghai')) = 2018-07-11

  11、year:过滤相应的年份的数据,在SQL中使用between...and...关键字,相应的如果未使用USE_TZ,将不会有时区相关的转换。但是如果使用了USE_TZ=True,在使用的between...and...的时候,会相应的把时间从TIME_ZONE设置的时区的时间转换成UTC时区的时间,然后再去数据库中查找。示例如下:
  articles = Article.objects.filter(create_time__year=2018)
  原生SQL:article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` BETWEEN 2017-12-31 16:00:00 AND 2018-12-31 15:59:59.999999 # setting.py文件中配置的是USE_TZ=True,TIME_ZONE="Asia/Shanghai"

  12、month:根据月份过滤数据,用法date相同,在将数据库里的时间使用CONVERT_TZ转换成当前时区的时间,然后再提取月份信息进行比对查询

  13、day:根据日期查询,用法基本与date,month一致,示例代码如下:

  articles = Article.objects.filter(create_time__month=3)
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE EXTRACT(MONTH FROM CONVERT_TZ(`article`.`create_time`, 'UTC', 'Asia/Shanghai')) = 3

  14、week_day:根据周几过滤数据,用法基本与date,month一致,1表示周日,2-6表示周一到周五,7表示周六

  15、time:根据时间过滤,如果精确到秒的话,一般与range连用

  16、isnull:根据是否为空进行查找,在数据库中也是IS NULL
  articles = Article.objects.filter(create_time__isnull=True)
  原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` IS NULL

  17、regex/iregex:根据正则进行过滤,regex区分大小写,iregex不区分大小写
  articles = Article.objects.filter(create_time__regex=r'^hello')
  SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` REGEXP BINARY ^hello

django orm 的查询条件的更多相关文章

  1. django ORM常用查询条件

    假设有一个模型 class Article(models.Model): title=models.CharField(max_length=50) content=models.TextField( ...

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

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

  3. Django orm 常用查询筛选总结

    本文主要列举一下django orm中的常用查询的筛选方法: 大于.大于等于 小于.小于等于 in like is null / is not null 不等于/不包含于 其他模糊查询 model: ...

  4. Django --- ORM表查询

    目录 使用数据库之前的配置工作 单表操作常用的方法 一对多字段的增删改查 多对多字段数据的增删改查 跨表查询 聚合函数 分组查询 F与Q查询 使用数据库之前的配置工作 settings.py中的配置 ...

  5. django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...

  6. django orm高级查询 F表达式和Q表达式以及分组annotate

    1.关联关系映射及查询1.1django默认开启延迟加载所有多对1和1对1如果不使用select_related(),需要会延迟加载获取到相关对象,因为延迟可能会造成n+1次查询的问题,所以便有了se ...

  7. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...

  8. Python - Django - ORM 分组查询补充

    单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField( ...

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

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

随机推荐

  1. hihoCoder 网络流四·最小路径覆盖

    题面带解释 hihoCoder感觉很好. 网络流的精华就是建图 #include<cstdio> #include<iostream> #include<algorith ...

  2. HttpContext.RewritePath

    定义:使用给定路径重写 URL.就是可以跳转到指定的URL. 也可以做为伪静态的跳转.具体如下. 他的重载 ①新建一个页面,放两个链接到另一个页面,注意给的链接 ②在 global.asax 文件中 ...

  3. C#浏览器中在线操作文档

    源码地址:https://github.com/SeaLee02/FunctionModule   文件夹 UploadFiles/WebDemo/COM/OnlineEdit.aspx 就是源码 用 ...

  4. 通过ip地址访问同一局域网下已经启动的angular项目

    通常tomcat启动的项目同一局域网下我们都可以访问.angular启动的前台项目别人怎么访问,一直不懂,后来知道启动命令加个参数就行了 首先查看本机ip 第二步,启动命令里加上--host 本机ip ...

  5. iOS 远程通知(Remote Notification)和本地通知(Local Notification)

    ios通知分为远程通知和本地通知,远程通知需要连接网络,本地通知是不需要的,不管用户是打开应用还是关闭应用,我们的通知都会发出,并被客户端收到 我们使用远程通知主要是随时更新最新的数据给用户,使用本地 ...

  6. 使用phpExcel将数据批量导出

    if(isset($_POST['export']) && $_POST['export'] == '导出所选数据') { //此处为多选框已勾选的数据 $export_id=$_PO ...

  7. spring-传统AOP

    Spring传统AOP AOP的增强类型 AOP联盟定义了Advice(org.aopalliance.aop.Interface.Advice) 五类(目标类方法的连接点): 1.  前置通知(or ...

  8. 7-3 python操作excel

    1.写excel 写入特定单元格数据 # .导入xlwt模块 # .新建一个excel # .添加一个sheet页 # .往指定的单元格中写入数据 # .保存excel import xlwt boo ...

  9. composer环境安装

    PHP很多优秀的框架,例如Laravel等等,镜像都在国外,相关的包管理工具Composer也是在国外,所以安装失败的可能性很大,题主所示的就是因为连不上Composer.解决方法如下: 进入官网, ...

  10. 关于sql server 2008 r2 展开时报错:参数名:viewInfo ( Microsoft SqlServer Management SqlStudio Explorer )解决思路

    今天安装了sql server 2008 R2,安装成功之后我打开软件登陆都没问题,但是一展开选项就弹出错误提示框: 参数名:viewInfo 不能为空 (Microsoft SqlServer Ma ...