字段查詢
實現(xiàn)sql中where的功能流礁,調用過濾器filter()崇棠、exclude()丸卷、get()谜嫉,下面以filter()為例沐兰。
通過"屬性名_id"表示外鍵對應對象的id值蔽挠。
語法如下:
說明:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線比原。
屬性名稱__比較運算符=值
查詢mysql數(shù)據(jù)庫日志
查看mysql數(shù)據(jù)庫日志可以查看對數(shù)據(jù)庫的操作記錄量窘。 mysql日志文件默認沒有產(chǎn)生氢拥,需要做如下配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
把68锨侯,69行前面的#去除囚痴,然后保存并使用如下命令重啟mysql服務深滚。 sudo service mysql restart
使用如下命令打開mysql日志文件成箫。
sudo tail -f /var/log/mysql/mysql.log #可以實時查看數(shù)據(jù)庫的日志內容
打開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='傳')
tartswith捅彻、endswith:以指定值開頭或結尾步淹。
例:查詢書名以'部'結尾的圖書
list = BookInfo.objects.filter(btitle__endswith='部')
以上運算符都區(qū)分大小寫,在這些運算符前加上i表示不區(qū)分大小寫键闺,如iexact幼驶、icontains、istartswith购桑、iendswith.
3) 空查詢
isnull:是否為null。
例:查詢書名不為空的圖書硕噩。
list = BookInfo.objects.filter(btitle__isnull=False)
4) 范圍查詢
in:是否包含在范圍內缭贡。
例:查詢編號為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)
不等于的運算符燃乍,使用exclude()過濾器橘沥。
例:查詢編號不等于3的圖書
list = BookInfo.objects.exclude(id=3)
6) 日期查詢
year座咆、month仓洼、day色建、week_day、hour某残、minute、second:對日期時間類型的屬性進行運算介牙。
例:查詢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對象
之前的查詢都是對象的屬性與常量值比較徐伐,兩個屬性怎么比較呢? 答:使用F對象魏保,被定義在django.db.models中摸屠。
語法如下:
F(屬性名)
例:查詢閱讀量大于等于評論量的圖書季二。
from django.db.models import F
...
list = BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F對象上使用算數(shù)運算。
例:查詢閱讀量大于2倍評論量的圖書刻蚯。
list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
Q對象
多個過濾器逐個調用表示邏輯與關系炊汹,同sql語句中where部分的and關鍵字讨便。
例:查詢閱讀量大于20,并且編號小于3的圖書霸褒。
list=BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
如果需要實現(xiàn)邏輯或or的查詢废菱,需要使用Q()對象結合|運算符殊轴,Q對象被義在django.db.models中梳凛。
語法如下:
Q(屬性名__運算符=值)
例:查詢閱讀量大于20的圖書韧拒,改寫為Q對象如下。
from django.db.models import Q
...
list = BookInfo.objects.filter(Q(bread__gt=20))
Q對象可以使用&塑悼、|連接厢蒜,&表示邏輯與斑鸦,|表示邏輯或巷屿。
例:查詢閱讀量大于20嘱巾,或編號小于3的圖書诫钓,只能使用Q對象實現(xiàn)
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q對象前可以使用~操作符菌湃,表示非not惧所。
例:查詢編號不等于3的圖書纯路。
list = BookInfo.objects.filter(~Q(pk=3))
聚合函數(shù)
使用aggregate()過濾器調用聚合函數(shù)寞忿。聚合函數(shù)包括:Avg驰唬,Count,Max,Min叫编,Sum辖佣,被定義在django.db.models中。
例:查詢圖書的總閱讀量搓逾。
from django.db.models import Sum
...
list = BookInfo.objects.aggregate(Sum('bread'))
注意aggregate的返回值是一個字典類型卷谈,格式如下:
{'聚合類小寫__屬性名':值}
如:{'sum__bread':3}
使用count時一般不使用aggregate()過濾器。
例:查詢圖書總數(shù)霞篡。
list = BookInfo.objects.count()
注意count函數(shù)的返回值是一個數(shù)字世蔗。