Django模型-條件查詢

字段查詢

實(shí)現(xiàn)sql中where的功能,調(diào)用過濾器filter()、exclude()、get(),下面以filter()為例。

語法如下:

?????????? 屬性名稱__比較運(yùn)算符=值

注:屬性名稱和比較運(yùn)算符間使用兩個(gè)下劃線,所以屬性名不能包括多個(gè)下劃線。

查詢mysql數(shù)據(jù)庫日志

查看mysql數(shù)據(jù)庫日志可以查看對數(shù)據(jù)庫的操作記錄。

mysql日志文件默認(rèn)沒有產(chǎn)生,需要做如下配置:

??????????????????????? sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

把68,69行前面的#去除,然后保存并使用如下命令重啟mysql服務(wù)。

??????????????????????? sudo service mysql restart

使用如下命令打開mysql日志文件。

?????????????????????? sudo tail -f /var/log/mysql/mysql.log#可以實(shí)時(shí)查看數(shù)據(jù)庫的日志內(nèi)容

打開booktest/views.py文件,在index視圖中編寫如下查詢代碼:

?????????????????????? ? ? ? ?? 條件查詢

(1) 查詢等

exact:表示判等。

例:查詢編號為1的圖書。

??????????? list=BookInfo.objects.filter(id__exact=1)

可簡寫為:

?????????? list=BookInfo.objects.filter(id=1)

(2) 模糊查詢

contains:是否包含。

例:查詢書名包含'傳'的圖書。

??????????? list = BookInfo.objects.filter(btitle__contains='傳')

startswith、endswith:以指定值開頭或結(jié)尾。

例:查詢書名以'部'結(jié)尾的圖書

??????????? list = BookInfo.objects.filter(btitle__endswith='部')

注:以上運(yùn)算符都區(qū)分大小寫,在這些運(yùn)算符前加上? i? 表示不區(qū)分大小寫,如 iexact、icontains、istartswith、iendswith.

(3) 空查詢

isnull:是否為null。

例:查詢書名不為空的圖書。

?????????? list = BookInfo.objects.filter(btitle__isnull=False)

(4) 范圍查詢

in:是否包含在范圍內(nèi)。

例:查詢編號為1或3或5的圖書

?????????? list = BookInfo.objects.filter(id__in=[1,3,5])

5) 比較查詢

gt、gte、lt、lte:大于、大于等于、小于、小于等于。

例:查詢編號大于3的圖書

?????????? list = BookInfo.objects.filter(id__gt=3)

不等于的運(yùn)算符,使用exclude()過濾器。

例:查詢編號不等于3的圖書

???????????? list = BookInfo.objects.exclude(id=3)

6) 日期查詢

year、month、day、week_day、hour、minute、second:對日期時(shí)間類型的屬性進(jìn)行運(yùn)算。

例:查詢1980年發(fā)表的圖書。

???????????? list = BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日后發(fā)表的圖書。

???????????? list = BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))

F對象

之前的查詢都是對象的屬性與常量值比較,兩個(gè)屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中。

語法如下:f(屬性名)

例:查詢閱讀量大于等于評論量的圖書。

??????????????? from???? django.db.models??? import??? F

??????????????? list = BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F對象上使用算數(shù)運(yùn)算。

例:查詢閱讀量大于2倍評論量的圖書。

???????????? list = BookInfo.objects.filter(bread__gt=F('bcomment') *2)

Q對象

多個(gè)過濾器逐個(gè)調(diào)用表示邏輯與關(guān)系,同sql語句中where部分的and關(guān)鍵字。

例:查詢閱讀量大于20,并且編號小于3的圖書。

???????????? list=BookInfo.objects.filter(bread__gt=20,id__lt=3)? 或? list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要實(shí)現(xiàn)邏輯或or的查詢,需要使用Q()對象結(jié)合|運(yùn)算符,Q對象被義在django.db.models中。

語法如下: Q(屬性名__運(yùn)算符=值)

例:查詢閱讀量大于20的圖書,改寫為Q對象如下。

????????? from??? django.db.models??? import?? Q

????????? list = BookInfo.objects.filter(Q(bread__gt=20))

Q對象可以使用&、|連接,&表示并且,|表示或。

例:查詢閱讀量大于20,或編號小于3的圖書,只能使用Q對象實(shí)現(xiàn)

???????????? list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

Q對象前可以使用~操作符,表示非not。

例:查詢編號不等于3的圖書。

???????????? list = BookInfo.objects.filter(~Q(pk=3))

exclude() 也是取反

???????????? list = BookInfo.objects.exclude(id=3)

??????????? list = BookInfo.objects.exclude(id__exact=3)

聚合函數(shù)

使用aggregate()過濾器調(diào)用聚合函數(shù)。聚合函數(shù)包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中。

例:查詢圖書的總閱讀量。

????????????? from???? django.db.models???? import ?? Sum

????????????? list = BookInfo.objects.aggregate(Sum('bread'))

注意aggregate的返回值是一個(gè)字典類型,格式如下:

????????????? {'屬性名__聚合類小寫':值}

???????????? 如:{'bread__sum':3}

使用count時(shí)一般不使用aggregate()過濾器。

例:查詢圖書總數(shù)。

????????????? list = BookInfo.objects.count()

注意count函數(shù)的返回值是一個(gè)數(shù)字。

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

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

  • 字段查詢實(shí)現(xiàn)sql中where的功能,調(diào)用過濾器filter()、exclude()、get(),下面以filte...
    B頭閱讀 384評論 1 0
  • Web框架之Django: (1)簡介: Django是一個(gè)由Python寫成開源的重量級Web應(yīng)用框架,采用MT...
    老肖閱讀 3,169評論 0 18
  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,967評論 0 8
  • 團(tuán)團(tuán)在地鐵通道里走著,他已經(jīng)覺得自己的臉頰在發(fā)燙。他把頭低著,不敢抬眼,默默地跟著人群往前走…… 通道里的過堂風(fēng)順...
    猴山覽勝閱讀 703評論 0 0
  • 一念一世界,很多時(shí)候我們只需要改變一下關(guān)注的焦點(diǎn),原來阻礙我們成長的部分,就會(huì)變得沒那么可怕,甚至消失。 短期小目...
    漂亮的藍(lán)一閱讀 144評論 0 0

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