django orm 的查询条件

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

注:查询原生SQL语句:
  1、在queryset对象上:QuerySet.query

  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...关键字。传递一个两个元素的元祖,用来查询字段的值介于元祖的两个元素之间的对象,元祖的两个值可以是数字,此时用来过滤数值型的字段。当然元祖的两个元素也可以是一个时间,此时则用于过滤时间类型的字段

  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:根据月份过滤数据,用法与year相似

  13、day:根据日期查询,用法基本与year一致

  14、week_day:根据周几过滤数据,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

原文地址:https://www.cnblogs.com/limaomao/p/9302331.html

时间: 2024-10-08 05:15:27

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

django ORM常用查询条件

假设有一个模型 class Article(models.Model): title=models.CharField(max_length=50) content=models.TextField() class Meta: db_table='book' 对于查询结果是结果集,即通过filter进行查询所得的对象来说,可通过query属性来查看django转换之后的原生sql语句 -- article=Article.objects.filter(title='Hello World') p

Django - - 基础 - - Django ORM常用查询语法及进阶

目录 一般操作 必知必会13条 单表查询之神奇的双下划线 ForeignKey操作 正向查找 反向操作 ManyToManyField class RelatedManager 聚合查询和分组查询 聚合 分组 F查询和Q查询 F查询 Q查询 锁和事务 锁 事务 其他鲜为人知的操作(有个印象即可) Django ORM执行原生SQL QuerySet方法大全 Django终端打印SQL语句 在Python脚本中调用Django环境 1, 一般操作 官网文档:https://docs.djangop

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

版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了.  class A(models.Model):    name = models.CharField(u'名称')  class B(models.Model):    aa = models.ForeignKey(A)B.objects.filter(aa__name__contains='se

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

1.多表连接查询:  class A(models.Model): name = models.CharField(u'名称')  class B(models.Model):    aa = models.ForeignKey(A)B.objects.filter(aa__name__contains='searchtitle') 2 反向查询,后来插入记录  class A(models.Model):    name = models.CharField(u'名称')  class B(m

Python - Django - ORM 分组查询补充

单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() salary = models.IntegerField() province = models.CharField(max_length=32) dept = models.CharField(max_lengt

django orm 常用查询筛选

大于.大于等于 __gt 大于 __gte 大于等于 User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户 User.objects.filter(age__gte=10) // 查询年龄大于等于10岁的用户 小于.小于等于 __lt 小于 __lte 小于等于 User.objects.filter(age__lt=10) // 查询年龄小于10岁的用户 User.objects.filter(age__lte=10) // 查询年龄小于等于10岁的用

Django orm Q查询补充

Q类的用法 from django.db.models import Q q = Q() q.children.append(("username", "lyj")) q.children.append(("age", "18")) #如果不设置,默认是 and q.connector = "or" res = User.objects.filter(q) 原文地址:https://www.cnblogs.

Django ORM查询总结

Django ORM 中单表查询: querySet 与 model对象 1.all() :调用者:objects管理器,返回queryset 2.filter() : 调用者:objects管理器,返回queryset 3.get() 方法: 调用者:objects管理器,返回查询到的model对象(注意:查询结果有且只有一个才执行) 4.first(),last() 方法:调用者:queryset,返回model对象 5.exclude() : 调用者:objects管理器,返回一个quer

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r