【愚公系列】2022年01月 Python教學(xué)課程 42-Django框架之ORM中查詢?cè)斀?/h1>

      網(wǎng)友投稿 838 2025-04-01

      一、基礎(chǔ)條件查詢

      1.基本查詢

      get查詢單一結(jié)果,如果不存在會(huì)拋出模型類.DoesNotExist異常。

      all查詢多個(gè)結(jié)果。

      count查詢結(jié)果數(shù)量。

      >>> 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

      2.過濾查詢

      實(shí)現(xiàn)SQL中的where功能,包括

      filter過濾出多個(gè)結(jié)果

      exclude排除掉符合條件剩下的結(jié)果

      get過濾單一結(jié)果

      對(duì)于過濾條件的使用,上述三個(gè)方法相同,故僅以filter進(jìn)行講解。

      過濾條件的表達(dá)語法如下:

      屬性名稱__比較運(yùn)算符=值 # 屬性名稱和比較運(yùn)算符間使用兩個(gè)下劃線,所以屬性名不能包括多個(gè)下劃線

      查詢編號(hào)為1的圖書 查詢書名包含'湖'的圖書 查詢書名以'部'結(jié)尾的圖書 查詢書名為空的圖書 查詢編號(hào)為1或3或5的圖書 查詢編號(hào)大于3的圖書 查詢1980年發(fā)表的圖書 查詢1990年1月1日后發(fā)表的圖書

      1)相等

      exact:表示判等。

      例:查詢編號(hào)為1的圖書。

      BookInfo.objects.filter(id__exact=1) 可簡(jiǎn)寫為: BookInfo.objects.filter(id=1)

      2)模糊查詢

      contains:是否包含。

      說明:如果要包含%無需轉(zhuǎn)義,直接寫即可。

      例:查詢書名包含’傳’的圖書。

      BookInfo.objects.filter(name__contains='傳') ]>

      startswith、endswith:以指定值開頭或結(jié)尾。

      例:查詢書名以’部’結(jié)尾的圖書

      >>> BookInfo.objects.filter(name__endswith='部') ]>

      以上運(yùn)算符都區(qū)分大小寫,在這些運(yùn)算符前加上i表示不區(qū)分大小寫,如iexact、icontains、istartswith、iendswith.

      3) 空查詢

      isnull:是否為null。

      例:查詢書名為空的圖書。

      >>> BookInfo.objects.filter(name__isnull=True)

      4) 范圍查詢

      in:是否包含在范圍內(nèi)。

      【愚公系列】2022年01月 Python教學(xué)課程 42-Django框架之ORM中查詢?cè)斀? title=

      例:查詢編號(hào)為1或3或5的圖書

      >>> BookInfo.objects.filter(id__in=[1,3,5]) , ]>

      5)比較查詢

      gt大于 (greater then)

      gte大于等于 (greater then equal)

      lt小于 (less then)

      lte小于等于 (less then equal)

      例:查詢編號(hào)大于3的圖書

      BookInfo.objects.filter(id__gt=3)

      不等于的運(yùn)算符,使用exclude()過濾器。

      例:查詢編號(hào)不等于3的圖書

      >>> BookInfo.objects.filter(id__gt=3) ]>

      6)日期查詢

      year、month、day、week_day、hour、minute、second:對(duì)日期時(shí)間類型的屬性進(jìn)行運(yùn)算。

      例:查詢1980年發(fā)表的圖書。

      >>> BookInfo.objects.filter(pub_date__year=1980) ]>

      例:查詢1990年1月1日后發(fā)表的圖書。

      >>> BookInfo.objects.filter(pub_date__gt='1990-1-1') ]>

      3.F和Q對(duì)象

      F對(duì)象

      之前的查詢都是對(duì)象的屬性與常量值比較,兩個(gè)屬性怎么比較呢? 答:使用F對(duì)象,被定義在django.db.models中。

      語法如下:

      F(屬性名)

      例:查詢閱讀量大于等于評(píng)論量的圖書。

      >>> from django.db.models import F >>> BookInfo.objects.filter(readcount__gt=F('commentcount')) ]>

      可以在F對(duì)象上使用算數(shù)運(yùn)算。

      例:查詢閱讀量大于2倍評(píng)論量的圖書。

      >>> BookInfo.objects.filter(readcount__gt=F('commentcount')*2) ]>

      Q對(duì)象

      多個(gè)過濾器逐個(gè)調(diào)用表示邏輯與關(guān)系,同sql語句中where部分的and關(guān)鍵字

      例:查詢閱讀量大于20,并且編號(hào)小于3的圖書。

      >>> BookInfo.objects.filter(readcount__gt=20,id__lt=3) ]> 或者 >>> BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3) ]>

      如果需要實(shí)現(xiàn)邏輯或or的查詢,需要使用Q()對(duì)象結(jié)合|運(yùn)算符,Q對(duì)象被義在django.db.models中。

      語法如下:

      Q(屬性名__運(yùn)算符=值)

      例:查詢閱讀量大于20的圖書,改寫為Q對(duì)象如下。

      BookInfo.objects.filter(Q(readcount__gt=20))

      Q對(duì)象可以使用&、|連接,&表示邏輯與,|表示邏輯或。

      例:查詢閱讀量大于20,或編號(hào)小于3的圖書,只能使用Q對(duì)象實(shí)現(xiàn)

      >>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3)) , , ]>

      Q對(duì)象前可以使用~操作符,表示非not。

      例:查詢編號(hào)不等于3的圖書。

      >>> BookInfo.objects.filter(~Q(id=3)) , , ]>

      4.聚合函數(shù)和排序函數(shù)

      聚合函數(shù)

      使用aggregate()過濾器調(diào)用聚合函數(shù)。聚合函數(shù)包括:Avg平均,Count數(shù)量,Max最大,Min最小,Sum求和,被定義在django.db.models中。

      例:查詢圖書的總閱讀量。

      >>> from django.db.models import Sum >>> BookInfo.objects.aggregate(Sum('readcount')) {'readcount__sum': 126}

      注意aggregate的返回值是一個(gè)字典類型,格式如下:

      {'屬性名__聚合類小寫':值} 如:{'readcount__sum': 126}

      使用count時(shí)一般不使用aggregate()過濾器。

      例:查詢圖書總數(shù)。

      BookInfo.objects.count()

      注意count函數(shù)的返回值是一個(gè)數(shù)字。

      2. 排序

      使用order_by對(duì)結(jié)果進(jìn)行排序

      # 默認(rèn)升序 >>> BookInfo.objects.all().order_by('readcount') , , , ]> # 降序 >>> BookInfo.objects.all().order_by('-readcount') , , , ]>

      5.關(guān)聯(lián)查詢

      查詢書籍為1的所有人物信息 查詢?nèi)宋餅?的書籍信息

      由一到多的訪問語法:

      一對(duì)應(yīng)的模型類對(duì)象.多對(duì)應(yīng)的模型類名小寫_set 例:

      >>> book = BookInfo.objects.get(id=1) >>> book.peopleinfo_set.all() , , , , ]>

      由多到一的訪問語法:

      多對(duì)應(yīng)的模型類對(duì)象.多對(duì)應(yīng)的模型類中的關(guān)系類屬性名 例:

      person = PeopleInfo.objects.get(id=1) person.book

      訪問一對(duì)應(yīng)的模型類關(guān)聯(lián)對(duì)象的id語法:

      多對(duì)應(yīng)的模型類對(duì)象.關(guān)聯(lián)類屬性_id

      例:

      >>> person = PeopleInfo.objects.get(id=1) >>> person.book_id 1

      關(guān)聯(lián)過濾查詢

      由多模型類條件查詢一模型類數(shù)據(jù):

      語法如下:

      關(guān)聯(lián)模型類名小寫__屬性名__條件運(yùn)算符=值

      注意:如果沒有"__運(yùn)算符"部分,表示等于。

      查詢圖書,要求圖書人物為"郭靖" 查詢圖書,要求圖書中人物的描述包含"八"

      例:

      查詢圖書,要求圖書人物為"郭靖"

      >>> book = BookInfo.objects.filter(peopleinfo__name='郭靖') >>> book ]>

      查詢圖書,要求圖書中人物的描述包含"八"

      >>> book = BookInfo.objects.filter(peopleinfo__description__contains='八') >>> book , ]>

      由一模型類條件查詢多模型類數(shù)據(jù):

      語法如下:

      一模型類關(guān)聯(lián)屬性名__一模型類屬性名__條件運(yùn)算符=值

      注意:如果沒有"__運(yùn)算符"部分,表示等于。

      查詢書名為“天龍八部”的所有人物 查詢圖書閱讀量大于30的所有人物

      例:

      查詢書名為“天龍八部”的所有人物。

      >>> people = PeopleInfo.objects.filter(book__name='天龍八部') >>> people , , , ]>

      查詢圖書閱讀量大于30的所有人物

      >>> people = PeopleInfo.objects.filter(book__readcount__gt=30) >>> people , , , ,

      6.查詢集QuerySet

      1 概念

      Django的ORM中存在查詢集的概念。

      查詢集,也稱查詢結(jié)果集、QuerySet,表示從數(shù)據(jù)庫中獲取的對(duì)象集合。

      當(dāng)調(diào)用如下過濾器方法時(shí),Django會(huì)返回查詢集(而不是簡(jiǎn)單的列表):

      all():返回所有數(shù)據(jù)。

      filter():返回滿足條件的數(shù)據(jù)。

      exclude():返回滿足條件之外的數(shù)據(jù)。

      order_by():對(duì)結(jié)果進(jìn)行排序。

      對(duì)查詢集可以再次調(diào)用過濾器進(jìn)行過濾,如

      >>> books = BookInfo.objects.filter(readcount__gt=30).order_by('pub_date') >>> books , ]>

      也就意味著查詢集可以含有零個(gè)、一個(gè)或多個(gè)過濾器。過濾器基于所給的參數(shù)限制查詢的結(jié)果。

      從SQL的角度講,查詢集與select語句等價(jià),過濾器像where、limit、order by子句。

      判斷某一個(gè)查詢集中是否有數(shù)據(jù):

      exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False。

      2 兩大特性

      1)惰性執(zhí)行

      創(chuàng)建查詢集不會(huì)訪問數(shù)據(jù)庫,直到調(diào)用數(shù)據(jù)時(shí),才會(huì)訪問數(shù)據(jù)庫,調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與if合用

      例如,當(dāng)執(zhí)行如下語句時(shí),并未進(jìn)行數(shù)據(jù)庫查詢,只是創(chuàng)建了一個(gè)查詢集books

      books = BookInfo.objects.all()

      繼續(xù)執(zhí)行遍歷迭代操作后,才真正的進(jìn)行了數(shù)據(jù)庫的查詢

      for book in books: print(book.name)

      2)緩存

      使用同一個(gè)查詢集,第一次使用時(shí)會(huì)發(fā)生數(shù)據(jù)庫的查詢,然后Django會(huì)把結(jié)果緩存下來,再次使用這個(gè)查詢集時(shí)會(huì)使用緩存的數(shù)據(jù),減少了數(shù)據(jù)庫的查詢次數(shù)。

      情況一:如下是兩個(gè)查詢集,無法重用緩存,每次查詢都會(huì)與數(shù)據(jù)庫進(jìn)行一次交互,增加了數(shù)據(jù)庫的負(fù)載。

      from book.models import BookInfo [book.id for book in BookInfo.objects.all()] [book.id for book in BookInfo.objects.all()]

      情況二:經(jīng)過存儲(chǔ)后,可以重用查詢集,第二次使用緩存中的數(shù)據(jù)。

      books=BookInfo.objects.all() [book.id for book in books] [book.id for book in books]

      3 限制查詢集

      可以對(duì)查詢集進(jìn)行取下標(biāo)或切片操作,等同于sql中的limit和offset子句。

      注意:不支持負(fù)數(shù)索引。

      對(duì)查詢集進(jìn)行切片后返回一個(gè)新的查詢集,不會(huì)立即執(zhí)行查詢。

      如果獲取一個(gè)對(duì)象,直接使用[0],等同于[0:1].get(),但是如果沒有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()如果沒有數(shù)據(jù)引發(fā)DoesNotExist異常。

      示例:獲取第1、2項(xiàng),運(yùn)行查看。

      >>> books = BookInfo.objects.all()[0:2] >>> books , ]>

      4.分頁

      文檔

      #查詢數(shù)據(jù) books = BookInfo.objects.all() #導(dǎo)入分頁類 from django.core.paginator import Paginator #創(chuàng)建分頁實(shí)例 paginator=Paginator(books,2) #獲取指定頁碼的數(shù)據(jù) page_skus = paginator.page(1) #獲取分頁數(shù)據(jù) total_page=paginator.num_pages

      5G教育 Django Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:設(shè)置對(duì)象等高等寬(等寬如何設(shè)置)
      下一篇:WPS表格辦公—表格隔開不同數(shù)據(jù)(wps怎么隔開表格)

      相關(guān)文章
      亚洲国产精品免费视频| 亚洲精品乱码久久久久久按摩| 亚洲五月六月丁香激情| 亚洲人成人无码网www电影首页| 亚洲视频在线一区二区| 亚洲av片在线观看| 亚洲精品乱码久久久久久V | 国内精品久久久久影院亚洲| 亚洲AV成人噜噜无码网站| 亚洲一区在线视频| 国产精品亚洲精品青青青 | 亚洲伊人久久综合影院| 亚洲精品视频在线观看你懂的| 亚洲国产综合精品中文字幕| 亚洲精品人成无码中文毛片| 中文字幕亚洲日韩无线码| 亚洲熟妇av一区二区三区| 亚洲成色WWW久久网站| 亚洲av日韩av激情亚洲| 久久精品国产亚洲AV大全| 亚洲狠狠狠一区二区三区| 亚洲国产成人超福利久久精品| 亚洲一卡2卡3卡4卡国产网站 | 亚洲宅男精品一区在线观看| 97久久国产亚洲精品超碰热| 中日韩亚洲人成无码网站| 亚洲精品动漫免费二区| 国产尤物在线视精品在亚洲| 亚洲成A人片在线观看中文| 中文亚洲成a人片在线观看| 亚洲av最新在线网址| 久久精品国产亚洲77777| 国产成人亚洲合集青青草原精品| 亚洲影院天堂中文av色| 国产天堂亚洲精品| 国产专区一va亚洲v天堂| 久久精品国产亚洲| 亚洲乱码一二三四区麻豆| 亚洲人成网站色7799| 亚洲精品久久久www| 精品亚洲永久免费精品|