08-模型-條件查詢

  1. 字段查詢

    1. 實現(xiàn)sql中where的功能,調(diào)用過濾器filter()、exclude()、get(),下面以filter()為例
    2. 通過“屬性名_id”表示外鍵對應(yīng)對象的id值
    3. 語法如下
    4. 說明:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線
      1. 屬性名稱__比較運算符=值
  2. 條件運算符

    1. exact:表示判等

      1. 例:查詢編號為1的圖書
        list=BookInfo.books.filter(id__exact=1)
        可簡寫為:
        list=BookInfo.books.filter(id=1)
        
    2. contains:是否包含

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

    4. 例:查詢書名包含‘傳’的圖書

      1. list = BookInfo.books.filter(btitle__contains='傳')
    5. startswith、endswith:以指定值開頭或結(jié)尾

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

      1. list = BookInfo.books.filter(btitle__endswith='部')
    7. isnull:是否為null

      1. 例:查詢書名不為空的圖書
        list = BookInfo.books.filter(btitle__isnull=False)
    8. 以上運算符都區(qū)分大小寫,在這些運算符前加上i表示不區(qū)分大小寫,如iexact、icontains、istartswith、iendswith

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

      1. 例:查詢編號為1或3或5的圖書
        list = BookInfo.books.filter(pk__in=[1, 3, 5])
    10. gt、gte、lt、lte:大于、大于等于、小于、小于等于

      1. 例:查詢編號大于3的圖書
        list = BookInfo.books.filter(id__gt=3)
    11. 不等于使用等于的運算符,使用exclude()過濾器
      例:查詢編號不等于3的圖書
      list = BookInfo.books.exclude(id=3)

    12. 不等查詢
      year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算
      例:查詢1980年發(fā)表的圖書
      list = BookInfo.books.filter(bpub_date__year=1980)

    13. 日期查詢1

      例:查詢1980年1月1日后發(fā)表的圖書
      list = BookInfo.books.filter(bpub_date__gt=date(1990, 1, 1))

      日期查詢2

  3. 關(guān)聯(lián)查詢(外連接類似)

    1. Django中也能實現(xiàn)類似于join查詢
      語法如下

      1. 關(guān)聯(lián)模型類名小寫屬性名運算符=值

      2. 如果沒有沒有“__運算符”部分,表示等于,結(jié)果和sql中的inner join相同

        1. 例:查詢圖書,要求圖書中英雄的描述包含‘八’
            list = BookInfo.books.filter(heroinfo__hcontent__contains='八')
        
        1. 例:查詢書名為"天龍八部"的所有英雄
            list = HeroInfo.objects.filter(hbook__btitle='天龍八部')
        
    2. F對象

      之前的查詢都是對象的屬性與常量值比較,兩個屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中
      語法如下

      1. F(屬性名)
        例:查詢閱讀量大于等于評論量的圖書
      from django.db.models import F
      ...
      list = BookInfo.books.filter(bread__gte=F('bcommet'))
      
      1. 可以在F()對象上使用算數(shù)運算
        例:查詢閱讀量大于2倍評論量的圖書
      list = BookInfo.books.filter(bread__gt=F('bcommet') * 2)
      
    3. Q對象

      1. 多個過濾器逐個調(diào)用表示邏輯與關(guān)系,同sql語句中where部分的and關(guān)鍵字
      2. 例:查詢閱讀量大于20,并且編號小于3的圖書
        list=BookInfo.books.filter(bread__gt=20,id__lt=3)

        list=BookInfo.books.filter(bread__gt=20).filter(id__lt=3)
    3. 如果需要實現(xiàn)邏輯或or的查詢,需要使用Q()對象結(jié)合|運算符
    4. **Q對象被義在django.db.models中**
        1. 語法如下
            Q(屬性名__運算符=值)
            1. 例:查詢閱讀量大于20的圖書,改寫為Q對象如下
            from django.db.models import Q
            ...
            list = BookInfo.books.filter(Q(bread__gt=20))
            

        2. Q對象可以使用&、|連接,**&表示邏輯與,|表示邏輯或**
            1. 例:查詢閱讀量大于20,或編號小于3的圖書,只能使用Q對象實現(xiàn)
            list = BookInfo.books.filter(Q(bread__gt=20) | Q(pk__lt=3))
        

    5. Q對象前可以使用~操作符,表示非not
        1. 例:查詢編號不等于3的圖書
        list = BookInfo.books.filter(~Q(pk=3))
  1. 聚合函數(shù)
    1. 使用aggregate()過濾器調(diào)用聚合函數(shù)
      聚合函數(shù)包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中

      1. 例:查詢圖書的總閱讀量
      from django.db.models import Sum
      ...
      list = BookInfo.books.aggregate(Sum('bread'))
      
    2. 在運行服務(wù)器命令行可以看到list的字典結(jié)果

    3. 使用count時一般不使用aggregate()過濾器

      1. 例:查詢圖書總數(shù)
        list = BookInfo.books.count()
    4. 在運行服務(wù)器命令行可以看到list的結(jié)果

  1. 關(guān)聯(lián)查詢的練習(xí)

    1. 關(guān)聯(lián)的查詢
      在定義模型類時,可以指定三種關(guān)聯(lián)關(guān)系,最常用的是一對多關(guān)系,如本例中的“圖書-英雄”就為一對多關(guān)系,接下來進入shell練習(xí)關(guān)系的查詢

      python manage.py shell

      1. 查詢編號為1的圖書
        book=BookInfo.books.get(pk=1)

      2. 獲得book圖書的所有英雄
        book.heroinfo_set.all()

      3. 獲得編號為1的英雄
        hero=HeroInfo.objects.get(pk=1)

      4. 獲得hero英雄出自的圖書
        hero.hbook

    2. 自關(guān)聯(lián)

      1. 對于地區(qū)信息、分類信息等數(shù)據(jù),表結(jié)構(gòu)非常類似,每個表的數(shù)據(jù)量十分有限,為了充分利用數(shù)據(jù)表的大量數(shù)據(jù)存儲功能,可以可以設(shè)計成一張表,內(nèi)部的關(guān)系字段指向本表的主鍵,這就是自關(guān)聯(lián)的表結(jié)構(gòu)

      2. 打開booktest/models.py文件,定義AreaInfo類
        說明:關(guān)系屬性使用self指向本類,要求null和blank允許為空,因為一級數(shù)據(jù)是沒有父級的

      定義地區(qū)模型類,存儲省、市、區(qū)縣信息

      class AreaInfo(models.Model):
          atitle=models.CharField(max_length=30)#名稱
          aParent=models.ForeignKey('self',null=True,blank=True)#關(guān)系
      
      1. 遷移

        1. python manage.py makemigrations
          python manage.py migrate
      2. 打開mysql命令行,導(dǎo)入數(shù)據(jù)

        1. source areas.sql
      3. 打開booktest/views.py文件,定義視圖area

        from models import AreaInfo
        ...
        #查詢廣州市的信息
        def area(request):
            area = AreaInfo.objects.get(pk=440100)
            return render(request, 'booktest/area.html', {'area': area})
        
        
      4. 打開booktest/urls.py文件,新建一條url

        urlpatterns = [
            ...
            url(r'^area/$', views.area),
        ]
        
      5. 在templates/booktest目錄下,新建area.html文件

        <html>
        <head>
            <title>地區(qū)</title>
        </head>
        <body>
        當(dāng)前地區(qū):{{area.atitle}}
        <hr/>
        上級地區(qū):{{area.aParent.atitle}}
        <hr/>
        下級地區(qū):
        <ul>
            {%for a in area.areainfo_set.all%}
            <li>{{a.atitle}}</li>
            {%endfor%}
        </ul>
        </body>
        </html>
        
        1. 運行服務(wù)器
          python manage.py runserver
  2. 總結(jié)

    1. 修改配置文件使用mysql數(shù)據(jù)庫
    2. 屬性類型及選項
    3. 自定義管理器及用途
    4. 查詢集和條件查詢
    5. 關(guān)聯(lián)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 元選項 ? 在模型類中定義類 Meta,用于設(shè)置元信息? 元信息db_table:定義數(shù)據(jù)表名稱,推薦使用小寫字母...
    流藍淺閱讀 482評論 0 0
  • 前言 根據(jù)前幾篇文章的分享已經(jīng)了解djangoWeb開發(fā)一般步驟為:創(chuàng)建虛擬環(huán)境安裝django創(chuàng)建項目創(chuàng)建應(yīng)用在...
    博行天下閱讀 1,195評論 0 2
  • 簡介 查詢集表示從數(shù)據(jù)庫中獲取的對象集合。查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數(shù)限制查詢的結(jié)果...
    a上癮閱讀 1,326評論 0 0
  • 1,定義屬性 Django根據(jù)屬性的類型確定以下信息: 當(dāng)前選擇的數(shù)據(jù)庫支持字段的類型 渲染管理表單時使用的默認h...
    曉可加油閱讀 604評論 0 2
  • 今天出去要資源,外面特別冷,自己也受到影響。所以導(dǎo)致今天狀況特別差勁。遇到人們拒絕之后,也沒有傾盡全力要微信。一切...
    小小小小瘋癲閱讀 119評論 2 0

友情鏈接更多精彩內(nèi)容