這一篇介紹關於範圍,日期的篩選
- 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 的用法。
本文首發於本人微信公眾號:Hunter後端
原文連結:Django筆記十五之in查詢及date日期相關過濾操作
如果想獲取更多相關文章,可掃碼關注閱讀: