Django學(xué)習(xí)-第八講:django ORM數(shù)據(jù)庫查詢,修改等操作

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對象上。

    1. 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是用來對字符串比較的)。

    1. 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%';\
    1. 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])
    1. 根據(jù)關(guān)聯(lián)的表進(jìn)行查詢
      想要獲取文章標(biāo)題中包含"hello"的所有的分類。那么可以通過以下代碼來實現(xià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)容可以參照官文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容