1.查詢操作
查找是數(shù)據(jù)庫操作中一個非常重要的技術(shù)。查詢一般就是使用filter、exclude以及get三個方法來實現(xiàn)。我們可以在調(diào)用這些方法的時候傳遞不同的參數(shù)來實現(xiàn)查詢需求。在ORM層面,這些查詢條件都是使用field+__+condition的方式來使用的。
1.1.查詢條件
- 1 .
exact
使用精確的=進(jìn)行查找。如果提供的是一個None,那么在SQL層面就是被解釋為NULL
article = Article.objects.get(id__exact=14)
article = Article.objects.get(id__exact=None)
以上的兩個查找在翻譯為SQL語句
select * from article where id=14;
select * from article where id IS NULL;
article.query,可以得到Django執(zhí)行的SQL語句。但是只能作用于QuerySet對象上。
iexact
使用like進(jìn)行查找。
article = Article.objects.filter(title__iexact='hello world')
那么以上的查詢就等價于以下的SQL語句:
select * from article where title like 'hello world';
注意上面這個sql語句,因為在MySQL中,沒有一個叫做ilike的。所以exact和iexact的區(qū)別實際上就是LIKE和=的區(qū)別,在大部分collation=utf8_general_ci情況下都是一樣的(collation是用來對字符串比較的)。
contains
大小寫敏感,判斷某個字段是否包含了某個數(shù)據(jù)。
articles = Article.objects.filter(title__contains='hello')
在翻譯成SQL語句為如下:
select * where title like binary '%hello%';
要注意的是,在使用contains的時候,翻譯成的sql語句左右兩邊是有百分號的,意味著使用的是模糊查詢。而exact翻譯成sql語句左右兩邊是沒有百分號的,意味著使用的是精確的查詢。
- 4.
icontains
大小寫不敏感的匹配查詢。
articles = Article.objects.filter(title__icontains='hello')
在翻譯成SQL語句為如下:
select * where title like '%hello%';\
-
in
提取那些給定的field的值是否在給定的容器中。容器可以為list、tuple或者任何一個可以迭代的對象,包括QuerySet對象。
-
articles = Article.objects.filter(id__in=[1,2,3])
以上代碼在翻譯成SQL語句為如下:
select *from articles where id in (1,2,3)
當(dāng)然也可以傳遞一個QuerySet對象進(jìn)去。
# 查找標(biāo)題為hello的文章分類
articles = Article.objects.filter(title__icontains="hello")
category = Category.objects.filter(article__in=articles)
# 查找文章ID為1,2,3的文章分類
category = Category.objects.filter(article__id__in=[1,2,3])
- 根據(jù)關(guān)聯(lián)的表進(jìn)行查詢
想要獲取文章標(biāo)題中包含"hello"的所有的分類。那么可以通過以下代碼來實現(xiàn):
- 根據(jù)關(guān)聯(lián)的表進(jìn)行查詢
categories = Category.object.filter(article__title__contains("hello"))
2. 比較運算
1. gt
某個field的值要大于給定的值。
# 將所有id大于4的文章全部都找出來。
articles = Article.objects.filter(id__gt=4)
將翻譯成以下SQL語句:
select * from articles where id > 4;
2. gte
類似于gt,是大于等于。
3.lt
類似于gt是小于。
4.lte
類似于lt,是小于等于。
5. range
判斷某個field的值是否在給定的區(qū)間中。
start_date = datetime(year=2019, month=12, day=1,hour=10,minute=0,second=0)
end_date = datetime(year=2019, month=12, day=30,hour=10,minute=0,second=0)
date_range = Common.objects.filter(test_date__range=(start_date,end_date))
以上代碼的意思是提取所有發(fā)布時間在2019/1/1到2019/12/12之間的文章。
將翻譯成以下的SQL語句:
SELECT `user_common`.`id`, `user_common`.`content`, `user_common`.`pid`, `user_common`.`test_date` FROM `user_common` WHERE `user_common`.`test_date` BETWEEN 2019-12-01 02:00:00 AND 2019-12-30 02:00:00。
6. date
針對某些date或者datetime類型的字段??梢灾付╠ate的范圍。并且這個時間過濾,還可以使用鏈?zhǔn)秸{(diào)用。
date_test = Common.objects.filter(test_date__date=datetime(year=2018,month=12,day=19))
print(date_test.query)
print(date_test)
翻譯成SQL語句:
SELECT `user_common`.`id`, `user_common`.`content`, `user_common`.`pid`, `user_common`.`test_date` FROM `user_common` WHERE DATE(`user_common`.`test_date`) = 2018-12-19
7. year
根據(jù)年份進(jìn)行查找。
articles = Article.objects.filter(pub_date__year=2018)
articles = Article.objects.filter(pub_date__year__gte=2017)
以上的代碼在翻譯成SQL語句為如下:
select ... where pub_date between '2018-01-01' and '2018-12-31';
select ... where pub_date >= '2017-01-01';
8.time
根據(jù)時間進(jìn)行查找。示例代碼如下:
articles = Article.objects.filter(pub_date__time=time(hour=15,minute=21,second=10))
以上的代碼是獲取每一天中15點21分10秒發(fā)表的所有文章。
# 查詢10秒到11秒之間的
start_date = time(hour=17,minute=21,second=10)
end_date = time(hour=17,minute=21,second=11)
date_test = Common.objects.filter(test_date__time__range = (start_date,end_date))
更多內(nèi)容可以參照官文檔