1. 程式人生 > >Django-模型(二)

Django-模型(二)

條件查詢

欄位查詢

實現sql中where的功能,呼叫過濾器filter()、exclude()、get(),下面以filter()為例。

通過"屬性名_id"表示外來鍵對應物件的id值。

語法如下:

說明:屬性名稱和比較運算子間使用兩個下劃線,所以屬性名不能包括多個下劃線。

屬性名稱__比較運算子=值

檢視mysql資料庫日誌

檢視mysql資料庫日誌可以檢視對資料庫的操作記錄。 mysql日誌檔案預設沒有產生,需要做如下配置:

sudo vi /etc/mysql/mysql.conf.d/mysqld.conf

把68,69行前面的#去除,然後儲存並使用如下命令重啟mysql服務。

sudo service mysql restart

使用如下命令開啟mysql日誌檔案。

sudo tail -f /var/log/mysql/mysql.log #可以實時檢視資料庫的日誌內容

開啟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:以指定值開頭或結尾。

例:查詢書名以'部'結尾的圖書

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

以上運算子都區分大小寫,在這些運算子前加上i表示不區分大小寫,如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年發表的圖書。

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

例:查詢1980年1月1日後發表的圖書。

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物件上使用算數運算。

例:查詢閱讀量大於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)

如果需要實現邏輯或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物件實現

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

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

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

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

聚合函式

使用aggregate()過濾器呼叫聚合函式。聚合函式包括: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()過濾器。

例:查詢圖書總數。

list = BookInfo.objects.count()

注意count函式的返回值是一個數字。