这一篇介绍关于范围,日期的筛选

  1. in
  2. range
  3. date
  4. year
  5. week
  6. weekday
  7. quarter
  8. hour

1、in

in 对应于 MySQL 中的 in 操作,可以接受数组、元组等类型数据作为参数:

Blog.objects.filter(id__in=[1,2,3])

对应的 SQL 是:

select * from blog_blog where id in (1,2,3);

字符串也可以作为参数,但是转义后的 SQL 的意思不太一样:


Blog.objects.filter(name__in="abc")

对应的 SQL 为:

select * from blog_blog where name in ('a', 'b', 'c');

in 操作也可以用于子查询动态的获取列表信息:

inner_qs = Blog.objects.filter(name__contains='hunter')
Entry.objects.filter(blog__in=inner_qs)

注意,以上的QuerySet 只在第二步的时候会去查询数据库,其SQL类似于:

select * from blog_entry where blog_id in (select id from blog_blog where name like binary '%hunter%')

在第一条语句中,没有指定字段,所以是默认搜索 id 的值

如果需要搜索其他字段,比如 name,则需要使用 values() 函数或者 values_list 来指定字段:

inner_qs = Blog.objects.filter(name__contains='hunter').values('name')
Entry.objects.filter(blog__name__in=inner_qs)

对应的 SQL 为:

select * from blog_entry where  FROM `blog_entry` INNER JOIN `blog_blog` ON (blog_entry.id = blog_blog.id)
where blog_blog.name in (select name from blog_blog where name like binary '%hunter%')

2、range

range 是在什么范围之内,对应于 SQL 中的 between and

可以作用在 整型和日期类型字段:


Blog.objects.filter(id__range=[1, 10]) Entry.objects.filter(pud_date__range=['2020-01-01', '2023-01-01'])

3、date

获取符合条件的日期,作用在 datetimefield 上,因为 datefield 本身就是日期,所以不需要 __date 开修饰。

假设一个 model 为 TestModel:

class TestModel(models.Model):
created_time = models.DateTimeField()

这个时候我们想要筛选某个日期,则可以如下使用:

TestModel.objects.filter(created_time__date='2022-01-01')

也可以和上一篇笔记中的 大小于结合使用:

TestModel.objects.filter(created_time__date__gte='2022-01-01')

4、year

筛选年份符合的数据,可作用于 datefield 和 datetimefield 上:

Entry.objects.filter(pub_date__year=2022)

对应的 SQL 为:

select * from blog_entry where pub_date between '2022-01-01' and '2022-12-31';

使用大小于操作:

Entry.objects.filter(pub_date__year__gte=2022)

对应的 SQL 是:

select * from blog_entry where pub_date >= '2022-01-01'

同样的,与 year 相对应的 month 和 day 也可以这样使用。

5、week

一年有 52 个周,如果想获取周数为第几个的话,可以如此操作:

Entry.objects.filter(pub_date__week=2)

对应的 SQL 为:

select * from blog_entry where WEEK(pub_date, 3) = 3;

6、weekday

weekday 对应的是 周几,周日是1,周一是2,到周六是 7

比如想找出 Entry 里所有周一的数据:

Entry.objects.filter(pub_date__weekday=2)

或者是想找出 2022年所有周一的数据:

Entry.objects.filter(pub_date__year=2022).filter(pub_date__weekday=2)

7、quarter

quarter 是查询季度数据,一年一共四个季度,1月1日到3月31日,4月1日到6月30日,7月1日到9月30日,10月1日到12月31日

比如查看所有第二季度的数据:

Entry.objects.filter(pub_date__quarter=2)

8、hour

hour 是小时,与上面的用法同:

TestModel.objects.filter(created_time__hour=9)

以上就是本篇笔记全部内容,接下来将介绍 Django 的 model 的聚合 aggregate 的用法。

本文首发于本人微信公众号:Hunter后端

原文链接:Django笔记十五之in查询及date日期相关过滤操作

如果想获取更多相关文章,可扫码关注阅读:

Django笔记十五之in查询及date日期相关过滤操作的更多相关文章

  1. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. (C/C++学习笔记) 十五. 构造数据类型

    十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...

  3. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  4. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  5. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  6. Django(十五)Form组件

    参考博客: https://www.cnblogs.com/haiyan123/p/7778888.html http://www.cnblogs.com/wupeiqi/articles/61441 ...

  7. (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)

    一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...

  8. Hibernate学习笔记(五)—— Hibernate查询方式

    一.对象图导航查询 对象图导航查询方式是根据已经加载的对象,导航到他的关联对象.它利用类与类之间的关系来查询对象.比如要查找一个联系人对应的客户,就可以由联系人对象自动导航找到联系人所属的客户对象.当 ...

  9. MYSQL进阶学习笔记十五:MySQL 的账号权限赋予!(视频序号:进阶_33,34)

    知识点十六:MySQL的账号权限赋予(33) 一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执 ...

  10. MySQL高级学习笔记(五):查询截取分析

    文章目录 慢查询日志 是什么 怎么玩 说明 查看是否开启及如何开启 默认 开启 那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? Case 配置版 日志分析工具mysqldumpsl ...

随机推荐

  1. css/js使用小技巧记录

    1.白底小图标换色 .iconBox { position: relative; width: 19px; height: 19px; overflow: hidden; // 隐藏原本颜色的图片 . ...

  2. 【LeetCode_15】——三数之和

    今天做了力扣中的一道经典题:三数之和.这题思路倒是很快想到,调逻辑可把我调得够呛,这也正说明我的刷题思维远远不够,比起我室友半个月刷300多题的思维差远了...革命尚未成功,同志仍需努力. 原题链接: ...

  3. #科技 #资讯 #生活 微信测试更多图片打开方式,神州圆满发射,英伟达或停产性价比神卡,SAMSUNG新一代显存带宽容量双翻倍,这就是今天的其它大新闻

    今天是2022年12月01日 十一月初八 现在是中午12:10 下面是今天的其他大新闻 #NEWS 1 # 微信测试用不同小程序打开图片:快捷调用小程序打开图片.视频.文件 ( 新浪科技 ) 据悉,微 ...

  4. 小梅哥课程学习——串口发送应用之发送数据(可在vivado中仿真出现正确波形)

    //1.底层代码源代码发送10位数据 module uart_pr( clk, reset_n, send_go, data, baud_set, tx_done, uart_tx ); input ...

  5. Linux cut和磁盘

    cut cut 选项: cut -d 指定分隔符 (awk -F) cut -f 数字,取第几列 –f3,6三列和6列 3-6(3到6行) cut -c 按字符取(空格也算) 指定冒号为分隔符,取第一 ...

  6. Oracle_20200416

    PLSQL 新建普通用户 1.使用system登录 2.File-->NEW-->SQL WINDOW 3.执行语句 --创建用户 --create user 用户名 identified ...

  7. JavaScript基础学习之一

    目录 let和var之间的区别 作用域不同 变量提升 暂时性死区(temporal dead zone,简称 TDZ) 相同作用域下的重复声明 脚本调用 数据类型 Boolean Object 对象 ...

  8. PHP中获取时间的下一周下个月的方法

    PHP中获取时间的下一周,下个月等通常用于定制服务的时候使用,比如包月会员,包年等等 //通常用于定制服务的时候使用,比如包月会员,包年等等 //获取当前时间过一个月的时间,以DATETIME格式显示 ...

  9. 转发 关于Windows安装解压版MySQL出现服务正在启动-服务无法启动的问题

    部分转自 :https://blog.csdn.net/u013901768/article/details/80707307 我是从服务器上复制了mysql的整个目录,到本地,然后怎么也不好用,看了 ...

  10. Linux调用python文件的同时传参

    创建python文件内容如下: 计算两个数相加并打印,需要传递两个参数 vi sum.py import sys def calc(a,b): c=a+b return c a1=int(float( ...