日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django模型(二)

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服務。

sudo service mysql restart

使用如下命令打開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中。

  • 語法如下:
F(屬性名)

例:查詢閱讀量大于等于評論量的圖書。

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中。
  • 語法如下:
Q(屬性名__運算符=)

例:查詢閱讀量大于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
python manage.py shell

情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載。

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



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

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


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模型(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。