(更新時間)2021年4月8日 Django框架 ORM中查詢詳解
基礎條件查詢
1 基本查詢
get查詢單一結果,如果不存在會拋出模型類.DoesNotExist異常。
all查詢多個結果。
count查詢結果數量。
>>> BookInfo.objects.get(id=1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2 過濾查詢
實現SQL中的where功能,包括
filter過濾出多個結果
exclude排除掉符合條件剩下的結果
get過濾單一結果
對于過濾條件的使用,上述三個方法相同,故僅以filter進行講解。
過濾條件的表達語法如下:
屬性名稱__比較運算符=值 # 屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線
1
2
3
查詢編號為1的圖書 查詢書名包含'湖'的圖書 查詢書名以'部'結尾的圖書 查詢書名為空的圖書 查詢編號為1或3或5的圖書 查詢編號大于3的圖書 查詢1980年發表的圖書 查詢1990年1月1日后發表的圖書
1
2
3
4
5
6
7
8
1)相等
exact:表示判等。
例:查詢編號為1的圖書。
BookInfo.objects.filter(id__exact=1) 可簡寫為: BookInfo.objects.filter(id=1)
1
2
3
2)模糊查詢
contains:是否包含。
說明:如果要包含%無需轉義,直接寫即可。
例:查詢書名包含’傳’的圖書。
BookInfo.objects.filter(name__contains='傳')
1
2
startswith、endswith:以指定值開頭或結尾。
例:查詢書名以’部’結尾的圖書
>>> BookInfo.objects.filter(name__endswith='部')
1
2
以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith.
3) 空查詢
isnull:是否為null。
例:查詢書名為空的圖書。
>>> BookInfo.objects.filter(name__isnull=True)
1
2
4) 范圍查詢
in:是否包含在范圍內。
例:查詢編號為1或3或5的圖書
>>> BookInfo.objects.filter(id__in=[1,3,5])
1
2
5)比較查詢
gt大于 (greater then)
gte大于等于 (greater then equal)
lt小于 (less then)
lte小于等于 (less then equal)
例:查詢編號大于3的圖書
BookInfo.objects.filter(id__gt=3)
1
不等于的運算符,使用exclude()過濾器。
例:查詢編號不等于3的圖書
>>> BookInfo.objects.filter(id__gt=3)
1
2
6)日期查詢
year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。
例:查詢1980年發表的圖書。
>>> BookInfo.objects.filter(pub_date__year=1980)
1
2
例:查詢1990年1月1日后發表的圖書。
>>> BookInfo.objects.filter(pub_date__gt='1990-1-1')
1
2
F和Q對象
F對象
之前的查詢都是對象的屬性與常量值比較,兩個屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中。
語法如下:
F(屬性名)
1
例:查詢閱讀量大于等于評論量的圖書。
>>> from django.db.models import F >>> BookInfo.objects.filter(readcount__gt=F('commentcount'))
1
2
3
可以在F對象上使用算數運算。
例:查詢閱讀量大于2倍評論量的圖書。
>>> BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
1
2
Q對象
多個過濾器逐個調用表示邏輯與關系,同sql語句中where部分的and關鍵字。
例:查詢閱讀量大于20,并且編號小于3的圖書。
>>> BookInfo.objects.filter(readcount__gt=20,id__lt=3)
1
2
3
4
5
如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符,Q對象被義在django.db.models中。
語法如下:
Q(屬性名__運算符=值)
1
例:查詢閱讀量大于20的圖書,改寫為Q對象如下。
BookInfo.objects.filter(Q(readcount__gt=20))
1
Q對象可以使用&、|連接,&表示邏輯與,|表示邏輯或。
例:查詢閱讀量大于20,或編號小于3的圖書,只能使用Q對象實現
>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
1
2
Q對象前可以使用~操作符,表示非not。
例:查詢編號不等于3的圖書。
>>> BookInfo.objects.filter(~Q(id=3))
1
2
聚合函數和排序函數
聚合函數
使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg平均,Count數量,Max最大,Min最小,Sum求和,被定義在django.db.models中。
例:查詢圖書的總閱讀量。
>>> from django.db.models import Sum >>> BookInfo.objects.aggregate(Sum('readcount')) {'readcount__sum': 126}
1
2
3
注意aggregate的返回值是一個字典類型,格式如下:
{'屬性名__聚合類小寫':值} 如:{'readcount__sum': 126}
1
2
3
使用count時一般不使用aggregate()過濾器。
例:查詢圖書總數。
BookInfo.objects.count()
1
注意count函數的返回值是一個數字。
2. 排序
使用order_by對結果進行排序
# 默認升序 >>> BookInfo.objects.all().order_by('readcount')
1
2
3
4
5
6
7
8
關聯查詢
查詢書籍為1的所有人物信息 查詢人物為1的書籍信息
1
2
由一到多的訪問語法:
一對應的模型類對象.多對應的模型類名小寫_set 例:
>>> book = BookInfo.objects.get(id=1) >>> book.peopleinfo_set.all()
1
2
3
由多到一的訪問語法:
多對應的模型類對象.多對應的模型類中的關系類屬性名 例:
person = PeopleInfo.objects.get(id=1) person.book
1
2
3
訪問一對應的模型類關聯對象的id語法:
多對應的模型類對象.關聯類屬性_id
例:
>>> person = PeopleInfo.objects.get(id=1) >>> person.book_id 1
1
2
3
關聯過濾查詢
由多模型類條件查詢一模型類數據:
語法如下:
關聯模型類名小寫__屬性名__條件運算符=值
1
注意:如果沒有"__運算符"部分,表示等于。
查詢圖書,要求圖書人物為"郭靖" 查詢圖書,要求圖書中人物的描述包含"八"
1
2
例:
查詢圖書,要求圖書人物為"郭靖"
>>> book = BookInfo.objects.filter(peopleinfo__name='郭靖') >>> book
1
2
3
查詢圖書,要求圖書中人物的描述包含"八"
>>> book = BookInfo.objects.filter(peopleinfo__description__contains='八') >>> book
1
2
3
由一模型類條件查詢多模型類數據:
語法如下:
一模型類關聯屬性名__一模型類屬性名__條件運算符=值
1
注意:如果沒有"__運算符"部分,表示等于。
查詢書名為“天龍八部”的所有人物 查詢圖書閱讀量大于30的所有人物
1
2
例:
查詢書名為“天龍八部”的所有人物。
>>> people = PeopleInfo.objects.filter(book__name='天龍八部') >>> people
1
2
3
查詢圖書閱讀量大于30的所有人物
>>> people = PeopleInfo.objects.filter(book__readcount__gt=30) >>> people 1 2 3 查詢集QuerySet 1 概念 Django的ORM中存在查詢集的概念。 查詢集,也稱查詢結果集、QuerySet,表示從數據庫中獲取的對象集合。 當調用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表): all():返回所有數據。 filter():返回滿足條件的數據。 exclude():返回滿足條件之外的數據。 order_by():對結果進行排序。 對查詢集可以再次調用過濾器進行過濾,如 >>> books = BookInfo.objects.filter(readcount__gt=30).order_by('pub_date') >>> books 1 2 3 也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數限制查詢的結果。 從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。 判斷某一個查詢集中是否有數據: exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。 2 兩大特性 1)惰性執行 創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用 例如,當執行如下語句時,并未進行數據庫查詢,只是創建了一個查詢集books books = BookInfo.objects.all() 1 繼續執行遍歷迭代操作后,才真正的進行了數據庫的查詢 for book in books: print(book.name) 1 2 2)緩存 使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數。 情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載。 from book.models import BookInfo [book.id for book in BookInfo.objects.all()] [book.id for book in BookInfo.objects.all()] 1 2 3 4 5 情況二:經過存儲后,可以重用查詢集,第二次使用緩存中的數據。 books=BookInfo.objects.all() [book.id for book in books] [book.id for book in books] 1 2 3 4 5 3 限制查詢集 可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。 注意:不支持負數索引。 對查詢集進行切片后返回一個新的查詢集,不會立即執行查詢。 如果獲取一個對象,直接使用[0],等同于[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發DoesNotExist異常。 示例:獲取第1、2項,運行查看。 >>> books = BookInfo.objects.all()[0:2] >>> books 1 2 3 4.分頁 文檔 #查詢數據 books = BookInfo.objects.all() #導入分頁類 from django.core.paginator import Paginator #創建分頁實例 paginator=Paginator(books,2) #獲取指定頁碼的數據 page_skus = paginator.page(1) #獲取分頁數據 total_page=paginator.num_pages 1 2 3 4 5 6 7 8 9 10 Django
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。