7.4ORM之數據庫操作

7.4.1增加數據

(1)save()

通過創建模型類對象,執行對象的save()方法保存到數據庫中

如:

>>> from booktest.models import BookInfo,HeroInfo

>>> from datetime import date

>>> book = BookInfo( btitle='西遊記', bput_date=date(1988,1,1), bread=10, bcomment=10 )

>>> book.save()

(2)create

通過模型類.objects.create()保存

如:

>>> HeroInfo.objects.create( hname='沙悟淨', hgender=0, hbook=book )

7.4.2查詢

(1)基本查詢

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

all 查詢多個結果。

count 查詢結果數量。

如:

>>> BookInfo.objects.get(id=3)

<BookInfo: 笑傲江湖>

(2)過濾查詢

實現SQL中的where功能,包括

  • filter 過濾出多個結果
  • exclude 排除掉符合條件剩下的結果
  • get 過濾單一結果

語法:屬性名稱__比較運算符=值

注意:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線

多個過濾器逐個調用表示邏輯與關係,同sql語句中where部分的and關鍵字

如:

# 查詢閱讀量大於20,並且編號小於3的圖書。

BookInfo.objects.filter(bread__gt=20,id__lt=3) 或 BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

1)相等

exact:表示判等。如判斷id是否等於1,可直接簡寫爲id=1

2)模糊查詢

contains:是否包含

startswith、endswith:以指定值開頭或結尾。

3)空查詢

isnull:是否爲null

4)範圍查詢

in:是否包含在範圍內。在[ ]中寫範圍的值

如:

#查詢編號爲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)

不等於的運算符,使用exclude()過濾器

6)日期查詢

year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算

如:

#查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

#查詢1980年1月1日後發表的圖書。

BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

7)F對象

使用F對象可以將兩個屬性進行比較,F對象被定義在django.db.models中。並 且,可以在F對象上使用算數運算。

語法:F(屬性名)

如:

# 查詢閱讀量大於等於評論量的圖書

from django.db.models import F

BookInfo.objects.filter(bread__gte=F('bcomment'))

# 查詢閱讀量大於2倍評論量的圖書。

BookInfo.objects.filter(bread__gt=F('bcomment') * 2)

8)Q對象

如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符,Q對象被義在django.db.models中

語法:Q(屬性名__運算符=值)

Q對象可以使用&、|連接,&表示邏輯與,|表示邏輯或。Q對象前可以使用~操作符,表示非not。

如:

# 查詢閱讀量大於20,或編號小於3的圖書

BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

9)聚合函數

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

注意:aggregate的返回值是一個字典類型,格式爲: {'屬性名__聚合類小寫':值}

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

(3)排序

使用order_by對結果進行排序

BookInfo.objects.all().order_by('bread') # 升序

BookInfo.objects.all().order_by('-bread') # 降序

(4)關聯查詢

1)由一到多的訪問語法

一對應的模型類對象.多對應的模型類名小寫_set 

如:

b = BookInfo.objects.get(id=1)

b.heroinfo_set.all()

2)由多到一的訪問語法

多對應的模型類對象.多對應的模型類中的關係類屬性名

如:

h = HeroInfo.objects.get(id=1)

h.hbook

3)訪問一對應的模型類關聯對象的id語法

多對應的模型類對象.關聯類屬性_id

如:

h = HeroInfo.objects.get(id=1)

h.hbook_id

(5)關聯過濾查詢

1)由多模型類條件查詢一模型類數據語法

關聯模型類名小寫__屬性名__條件運算符=值

注意:如果沒有"__條件運算符"部分,表示等於

2)由一模型類條件查詢多模型類數據語法

一模型類關聯屬性名__一模型類屬性名__條件運算符=值

注意:如果沒有"__條件運算符"部分,表示等於

7.4.3修改

(1)save

修改模型類對象的屬性,然後執行save()方法

如:

hero = HeroInfo.objects.get(hname='豬八戒')

hero.hname = '豬悟能' hero.save()

(2)update

使用模型類.objects.filter().update(),會返回受影響的行數

如:

HeroInfo.objects.filter(hname='沙悟淨').update(hname='沙僧')

7.4.4刪除

(1)模型類對象delete

如:

hero = HeroInfo.objects.get(id=13)

hero.delete()

(2)模型類.objects.filter().delete()

如:

HeroInfo.objects.filter(id=14).delete()

發佈了51 篇原創文章 · 獲贊 2 · 訪問量 5938
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章