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. python_5_password

    #1.python2中raw_input与python3中的input是相同的,python2中也有input但是别用(不好用,忘记它) #密码是明文的 username=input("us ...

  2. Media所有参数汇总

    Media所有参数汇总 我们最常需要用到的媒体查询器的三个特性,大于,等于,小于的写法.媒体查询器的全部功能肯定不止这三个功能,下面是我总结的它的一些参数用法解释: width:浏览器可视宽度. he ...

  3. alert、confirm、prompt的区别

    我们在开发一些后台管理系统的时候,经常会用到一些弹出框,今天我们一起看一下吧: alert:仅仅是一个提示的作用,通知用户,会阻线程,alert后面的代码,在用户点击确认后仍然会照常执行. confi ...

  4. js中的变量提升(Hoisting)

    <script> function test(){ console.log(a); console.log(foo()); var a=1; function foo(){ return ...

  5. mysql完全卸载大全

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...

  6. IntelliJ IDEA 12 创建Web项目 教程 超详细版【转】

    IntelliJ IDEA 12 新版本发布 第一时间去官网看了下  黑色的主题 很给力 大体使用了下  对于一开始就是用eclipse的童鞋们 估计很难从eclipse中走出来 当然 我也很艰难的走 ...

  7. php mysql find_in_set函数 检索单子段 逗号分隔序列

    FIND_IN_SET($kwd,field) 例如在 表 AA中 numbers 字段  保存列数据 1,4,8,75,41,7 就可以使用  FIND_IN_SET(8,numbers)  查询记 ...

  8. python__系统 : socket_UDP相关

    socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...

  9. TCP/IP协议之http和https协议

    一.TCP/IP协议 TCP/IP 是不同的通信协议的大集合. 1.TCP - 传输控制协议 TCP 用于从应用程序到网络的数据传输控制. TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们 ...

  10. POJ 1981 最大点覆盖问题(极角排序)

    Circle and Points Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 8346   Accepted: 2974 ...