共计 2299 个字符,预计需要花费 6 分钟才能阅读完成。
这一篇介绍对于范畴,日期的筛选
- in
- range
- date
- year
- week
- weekday
- quarter
- 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 的用法。
本文首发于自己微信公众号:Django 笔记。
原文链接:Django 笔记十五之 in 查问及 date 日期相干过滤操作
如果想获取更多相干文章,可扫码关注浏览: