Django模型(二)
Django模型(二)
文章目錄
- Django模型(二)
- 一、字段查詢
- 1.查看mysql數據庫日志
- 二、條件運算符
- 1.查詢等
- 2.模糊查詢
- 3.空查詢
- 4. 范圍查詢
- 5. 比較查詢
- 6).日期查詢
- 二、F對象:用于類屬性之間的比較
- 三、Q對象:用于查詢時條件之間的邏輯關系
- 四、聚合函數
- 五、查詢集
- 1.返回查詢集的過濾器如下:
- 2.返回單個值的過濾器如下:
- 3.判斷某一個查詢集中是否有數據:
- 4.兩大特性
- 5.查詢集的緩存
- 6.限制查詢集
一、字段查詢
實現sql中where的功能,調用過濾器filter()、exclude()、get(),下面以filter()為例。
通過"屬性名_id"表示外鍵對應對象的id值。
- 語法如下:
說明:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線。
屬性名稱__比較運算符=值1.查看mysql數據庫日志
查看mysql數據庫日志可以查看對數據庫的操作記錄。 mysql日志文件默認沒有產生,需要做如下配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.conf
把68,69行前面的#去除,然后保存并使用如下命令重啟mysql服務。
使用如下命令打開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))filter方法示例:
條件格式:
模型類屬性名__條件名=值
查詢圖書評論量為34的圖書的信息:
a)判等 條件名:exact。
例:查詢編號為1的圖書。
BookInfo.objects.get(id=1)
b)模糊查詢
例:查詢書名包含’傳’的圖書。contains
BookInfo.objects.filter(btitle__contains=‘傳’)
例:查詢書名以’部’結尾的圖書 endswith 開頭:startswith
BookInfo.objects.filter(btitle__endswith=‘部’)
c)空查詢 isnull
例:查詢書名不為空的圖書。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
d)范圍查詢 in
例:查詢id為1或3或5的圖書。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])
e)比較查詢 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查詢id大于3的圖書。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)
f)日期查詢
例:查詢1980年發表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
例:查詢1980年1月1日后發表的圖書。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查詢id不為3的圖書信息。
BookInfo.objects.exclude(id=3)
order_by方法示例:
作用:進行查詢結果進行排序。
例:查詢所有圖書的信息,按照id從小到大進行排序。
BookInfo.objects.all().order_by(‘id’)
例:查詢所有圖書的信息,按照id從大到小進行排序。
BookInfo.objects.all().order_by(’-id’)
例:把id大于3的圖書信息按閱讀量從大到小排序顯示。
BookInfo.objects.filter(id__gt=3).order_by(’-bread’)
二、F對象:用于類屬性之間的比較
之前的查詢都是對象的屬性與常量值比較,兩個屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中。
- 語法如下:
例:查詢閱讀量大于等于評論量的圖書。
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中。
- 語法如下:
例:查詢閱讀量大于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函數的返回值是一個數字。
五、查詢集
查詢集表示從數據庫中獲取的對象集合,在管理器上調用某些過濾器方法會返回查詢集,查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數限制查詢的結果,從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句。
1.返回查詢集的過濾器如下:
- all():返回所有數據。
- filter():返回滿足條件的數據
- exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字。
- order_by():對結果進行排序。
2.返回單個值的過濾器如下:
- get():返回單個滿足條件的對象
如果未找到會引發"模型類.DoesNotExist"異常。
如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常。
- count():返回當前查詢結果的總條數。
- aggregate():聚合,返回一個字典。
3.判斷某一個查詢集中是否有數據:
- exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。
4.兩大特性
- 惰性執行:創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用。
- 緩存:使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后把結果緩存下來,再次使用這個查詢集時會使用緩存的數據。
示例:查詢所有,編輯booktest/views.py的index視圖,運行查看。
list=BookInfo.objects.all()5.查詢集的緩存
每個查詢集都包含一個緩存來最小化對數據庫的訪問。
在新建的查詢集中,緩存為空,首次對查詢集求值時,會發生數據庫查詢,django會將查詢的結果存在查詢集的緩存中,并返回請求的結果,接下來對查詢集求值將重用緩存中的結果。
- 演示:運行項目shell
情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載。
from booktest.models import BookInfo [book.id for book in BookInfo.objects.all()] [book.id for book in BookInfo.objects.all()]
情況二:經過存儲后,可以重用查詢集,第二次使用緩存中的數據。
6.限制查詢集
可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。
注意:不支持負數索引。
對查詢集進行切片后返回一個新的查詢集,不會立即執行查詢。
| b[0] | 如果b[0]不存在,會拋出IndexError異常 |
| b[0:1].get() | 如果b[0:1].get()不存在,會拋出DoesNotExist異常 |
exists:判斷一個查詢集中是否有數據。True False
示例:獲取第1、2項,運行查看。
list=BookInfo.objects.all()[0:2]總結
以上是生活随笔為你收集整理的Django模型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django模型(一)
- 下一篇: Django模型(三)