(更新時間)2021年4月8日 Django框架 ORM中查詢詳解

      網友投稿 666 2022-05-30

      基礎條件查詢

      1 基本查詢

      get查詢單一結果,如果不存在會拋出模型類.DoesNotExist異常。

      all查詢多個結果。

      count查詢結果數量。

      >>> BookInfo.objects.get(id=1) >>> BookInfo.objects.get(pk=2) >>> BookInfo.objects.get(pk=20) Traceback (most recent call last): File "", line 1, in File "/home/python/.virtualenvs/py3_django_1.11/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/python/.virtualenvs/py3_django_1.11/lib/python3.5/site-packages/django/db/models/query.py", line 380, in get self.model._meta.object_name book.models.DoesNotExist: BookInfo matching query does not exist. >>> BookInfo.objects.all() , , , ]> >>> BookInfo.objects.count() 4

      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) ]> 或者 >>> BookInfo.objects.filter(readcount__gt=20).filter(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') , , , ]> # 降序 >>> 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

      (更新時間)2021年4月8日 Django框架 ORM中查詢詳解

      情況二:經過存儲后,可以重用查詢集,第二次使用緩存中的數據。

      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小時內刪除侵權內容。

      上一篇:excel表格數據透析的方法步驟圖
      下一篇:人臉檢測實戰終極:使用 OpenCV 和 Python 進行人臉對齊
      相關文章
      亚洲国产V高清在线观看| 亚洲av午夜成人片精品电影| 国产亚洲美女精品久久久| 色欲aⅴ亚洲情无码AV| 亚洲乱码中文字幕在线| 亚洲色偷偷偷综合网| 亚洲日韩一中文字暮| 亚洲国产精品无码久久久秋霞1| 国产AV旡码专区亚洲AV苍井空| 亚洲综合一区无码精品| 中日韩亚洲人成无码网站| 中文字幕精品三区无码亚洲| 亚洲精品无码不卡在线播放| 亚洲人成欧美中文字幕| 亚洲gay片在线gv网站| 日本亚洲高清乱码中文在线观看| 亚洲综合色区在线观看| 国产成人高清亚洲| 国产精品亚洲一区二区三区久久| 国产精品亚洲一区二区三区久久 | 亚洲精品国产啊女成拍色拍| 亚洲精品自拍视频| 亚洲一区二区免费视频| 亚洲综合精品伊人久久| 亚洲精品国产suv一区88| 婷婷亚洲综合一区二区| 亚洲一级Av无码毛片久久精品| 国产乱辈通伦影片在线播放亚洲 | 久久久久精品国产亚洲AV无码| 亚洲国产区男人本色在线观看| 亚洲精华国产精华精华液网站| 韩国亚洲伊人久久综合影院| 亚洲国产精品人人做人人爱| 在线观看亚洲av每日更新| 亚洲国产精华液网站w| 亚洲精品午夜久久久伊人| 亚洲国产激情在线一区| 含羞草国产亚洲精品岁国产精品| 亚洲国产精品13p| 国产日韩亚洲大尺度高清| 久久久久久亚洲AV无码专区|