1. 程式人生 > >django orm 的查詢條件

django orm 的查詢條件

進行 月份 cond style sta gte condition exc 條件過濾

Django的ORM查詢操作:
  查詢數據庫操作是一個非常重要的技術。在Django中,查詢一般就是使用filter、exclude、get三個方法來實現,在調用這些方法的時候傳遞不同的參數來實現查詢需求。
  在mysql中,想要查詢數據,就需要使用where關鍵字加上字段條件去查詢,在Django的orm之中,我們使用filter、exclude、get關鍵詞加上field+__+condition作為關鍵詞去查詢,現在我們就來介紹一下這裏的condition:

註:查詢原生SQL語句:
  1、在queryset對象上:QuerySet.query

  1、exact:精確查詢,在mysql數據庫中相當於"="(如果值是None,這裏就相當於is null),在這裏要說明的是這個查詢關鍵字在windows上是大小寫不敏感的,其實此時加不加__exact時都一樣,在Linux上當mysql的collation排序規則是utf8_bin的時候是大小寫敏感的,其他時候也是大小寫不敏感的:
    article = Article.objects.filter(id__exact=1)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` = 1

  2、iexact:在mysql中相當於‘like‘模糊查詢,但是在這裏值的前後不會加上%,其實也就相當於exact,這裏同樣也是大小寫不敏感的
    article = Article.objects.filter(id__iexact=1)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` LIKE 1

  3、contains:在mysql中相當於‘like‘模糊查詢,但是在這裏值的前後都會加上%,意思是要查詢的字段中是否包含某個字符串,這個條件過濾時是大小寫敏感的,也就是轉化成原生SQL的時候會在值的前面加上BINARY關鍵字:
    article = Article.objects.filter(title__contains=‘鋼鐵‘)
    原生的SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE BINARY %鋼鐵%

  4、icontains:用法和contains一樣,這是在這裏大消息是不敏感的
    article = Article.objects.filter(title__icontains=‘鋼鐵‘)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE %鋼鐵%

  5、in:在mysql中對應的也是in,用於判斷查詢的字段在不在某個可叠代對象中,這個可叠代對象可以是一個列表,也可以是一個元祖,當然也可以是一個queryset對象
    article = Article.objects.filter(id__in=[1,2,3])
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` IN (1, 2, 3)

  6、gt/gte/lt/lte:大於/ 大於等於/ 小於/ 小於等於
    articles = Article.objects.filter(id__gte=2)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`id` >= 2

  7、startswith/istartswith:以某個字符串開頭,在mysql中其實也是使用like關鍵字,只不過值的後邊加上%表示任意其他的字符串,所以這也就是查詢以特定字符串開頭,  startswith是大小寫敏感的,istartswith則是大小寫不敏感的
    articles = Article.objects.filter(title__startswith=‘hello‘)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id` FROM `article` WHERE `article`.`title` LIKE BINARY hello%

  8、endswith/iendswith:以某個字符串結尾,用法與startswith/istartswith相同,這裏就不贅述了

  9、range:對應到mysql數據庫時,使用的是between... and...關鍵字。傳遞一個兩個元素的元祖,用來查詢字段的值介於元祖的兩個元素之間的對象,元祖的兩個值可以是數字,此時用來過濾數值型的字段。當然元祖的兩個元素也可以是一個時間,此時則用於過濾時間類型的字段

  10、date:過濾符合條件的年月日,如果再設置文件中設定了USE_TZ=True,那麽在查詢的時候orm會使用CONVERT_TZ把數據庫裏的UTC時間轉換為你所設定的TIME_ZONE時區的時間,然後再與你的值進行比較查詢。當然在mysql中默認是沒有這些時區信息的,想要完成時區轉換你就必須要為你的數據庫添加能處理時區信息的功能,這個功能具體添加如下,訪問http://dev.mysql.com/downloads/timezones.html,下載timezone_2018e_posix.zip壓縮文件,將這個壓縮文件中的文件解壓後復制到mysql數據庫的mysql文件夾中,重啟mysql服務,這樣mysql就可以處理時區的轉換問題了。當然如果你的配置文件中設置了USE_TZ=False,那麽就不需要轉換時區了。
    articles = Article.objects.filter(create_time__date=datetime(year=2018,month=7,day=11))
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE DATE(CONVERT_TZ(`article`.`create_time`, ‘UTC‘, ‘Asia/Shanghai‘)) = 2018-07-11

  11、year:過濾相應的年份的數據,在SQL中使用between...and...關鍵字,相應的如果未使用USE_TZ,將不會有時區相關的轉換。但是如果使用了USE_TZ=True,在使用的between...and...的時候,會相應的把時間從TIME_ZONE設置的時區的時間轉換成UTC時區的時間,然後再去數據庫中查找。示例如下:
    articles = Article.objects.filter(create_time__year=2018)
    原生SQL:article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` BETWEEN 2017-12-31 16:00:00 AND 2018-12-31 15:59:59.999999 # setting.py文件中配置的是USE_TZ=True,TIME_ZONE="Asia/Shanghai"

  12、month:根據月份過濾數據,用法與year相似

  13、day:根據日期查詢,用法基本與year一致

  14、week_day:根據周幾過濾數據,1表示周日,2-6表示周一到周五,7表示周六

  15、time:根據時間過濾,如果精確到秒的話,一般與range連用

  16、isnull:根據是否為空進行查找,在數據庫中也是IS NULL
    articles = Article.objects.filter(create_time__isnull=True)
    原生SQL:SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` IS NULL

  17、regex/iregex:根據正則進行過濾,regex區分大小寫,iregex不區分大小寫
    articles = Article.objects.filter(create_time__regex=r‘^hello‘)
    SELECT `article`.`id`, `article`.`title`, `article`.`content`, `article`.`category_id`, `article`.`create_time` FROM `article` WHERE `article`.`create_time` REGEXP BINARY ^hello

django orm 的查詢條件