1. 程式人生 > >Django框架——ORM資料庫操作

Django框架——ORM資料庫操作

目錄


測試資料:BookInfo表

在這裡插入圖片描述
PeopleInfo表
在這裡插入圖片描述

一.增加

1.save:
物件 = 模型類(
欄位名 = 值,
欄位名 = 值,

)
物件.save()
例:

>>> book = BookInfo(
...         name='python入門',
...         pub_date='2010-1-1'
...     )
>>> book.save()
>>> book
<BookInfo: python入門>

2.create:
模型類.objects.create(
欄位名 = 值,
欄位名 = 值,

)
例:

>>> PeopleInfo.objects.create(
...         name='itheima',
...         book=book
...     )
<PeopleInfo: itheima>

二.刪除

1.模型類物件delete:
物件 = 模型類.objects.get(條件)
物件.delete()
例:

>>> person = PeopleInfo.objects.get(name='傳智播客')
>>> person.delete()
(1, {'book.PeopleInfo': 1})

2.模型類.objects.filter().delete():
模型類.objects.filter(條件).delete()
例:

>>> BookInfo.objects.filter(name='python入門').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

三.修改

1.save:
物件 = 模型類.objects.get(條件)
物件.屬性 = 值
物件.save()
例:

>>> person = PeopleInfo.objects.get(name='itheima')
>>> person.name = 'itcast'
>>> person.save()
>>> person
<PeopleInfo: itcast>

2.update:
模型類.objects.filter(條件).update(屬性=值) (返回的是受影響的行數)
例:

>>> PeopleInfo.objects.filter(name='itcast').update(name='傳智播客')
1

四.查詢

1.基本查詢

get:查詢單一結果,不存在會丟擲DoesNotExist異常。(查詢結果不是1個也會報錯)
all:查詢多個結果。
count:查詢結果數量。
用法:模型類.objects.get/all/count()

2.過濾查詢

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

3.過濾條件語法

用法:屬性名稱__比較運算子 = 值
exact:相等
例:查詢編號為1的圖書。

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

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

BookInfo.objects.filter(name__contains='傳')
<QuerySet [<BookInfo: 射鵰英雄傳>]>

startswith/endswith:以指定值開頭/結尾
例:查詢書名以’部’結尾的圖書

>>> BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龍八部>]>

isnull:是否為空
例:查詢書名為空的圖書。

>>> BookInfo.objects.filter(name__isnull=True)
<QuerySet []>

in:是否包含在範圍內
例:查詢編號為1或3或5的圖書

>>> BookInfo.objects.filter(id__in=[1,3,5])
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 笑傲江湖>]>

gt/gte/lt/lte:比較查詢,分別為大於,大於等於,小於,小於等於
例:查詢編號大於3的圖書

>>> BookInfo.objects.filter(id__gt=3)
<QuerySet [<BookInfo: 雪山飛狐>]>

year/month/day/week_day/hour/minute/second:時間日期
例:查詢1980年發表的圖書。

>>> BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射鵰英雄傳>]>

4.F物件和Q物件

F物件:用來比較兩個屬性(使用前需要匯入)
用法:F(屬性名)
例:查詢閱讀量大於等於評論量的圖書。

>>> from django.db.models import F
>>> BookInfo.objects.filter(readcount__gt=F('commentcount'))
<QuerySet [<BookInfo: 雪山飛狐>]>

Q物件:實現邏輯或or的查詢
用法:Q(屬性名__運算子=值),也可在前面加~表示not
例:查詢閱讀量大於20,或編號小於3的圖書

>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>

5.聚合函式

聚合函式:可使用aggregate()過濾器呼叫聚合函式(Avg,Count,Max,Min,Sum)
用法:模型類.objects.aggregate(聚合函式(欄位名))
例:查詢圖書的總閱讀量。

>>> from django.db.models import Sum
>>> BookInfo.objects.aggregate(Sum('readcount'))
{'readcount__sum': 126}
返回值為字典型別:{'屬性名__聚合類小寫':值}

注意:使用count一般不用使用過濾器
例:查詢圖書總數。

BookInfo.objects.count()
返回值為一個數字

6.排序函式

用法:模型類.objects.all().order_by(屬性名)
預設升序排序,屬性名前加-為降序
例:

# 預設升序
>>> BookInfo.objects.all().order_by('readcount')
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 笑傲江湖>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>

# 降序
>>> BookInfo.objects.all().order_by('-readcount')
<QuerySet [<BookInfo: 雪山飛狐>, <BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射鵰英雄傳>]>

7.關聯查詢

一到多的訪問:
用法:一對應的模型類物件.多對應的模型類名小寫_set
例:查詢id為1的書籍人物

>>> book = BookInfo.objects.get(id=1)
>>> book.peopleinfo_set.all()
<QuerySet [<PeopleInfo: 郭靖>, <PeopleInfo: 黃蓉>, <PeopleInfo: 黃藥師>, <PeopleInfo: 歐陽鋒>, <PeopleInfo: 梅超風>]>

多到一的訪問:
用法:多對應的模型類物件.多對應的模型類中的關係類.屬性名
例:查詢id為1的人物的書籍

>>> person = PeopleInfo.objects.get(id=1)
>>> person.book.name
‘射鵰英雄傳’

關聯過濾查詢:
用法:關聯模型類名小寫__屬性名__條件運算子=值
例:查詢圖書,要求圖書中人物的描述包含"八"

>>> book = BookInfo.objects.filter(peopleinfo__description__contains='八')
>>> book
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>]>

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

>>> people = PeopleInfo.objects.filter(book__readcount__gt=30)
>>> people
<QuerySet [<PeopleInfo: 喬峰>, <PeopleInfo: 段譽>, <PeopleInfo: 虛竹>, <PeopleInfo: 王語嫣>, <PeopleInfo: 胡斐>, <PeopleInfo: 苗若蘭>, <PeopleInfo: 程靈素>, <PeopleInfo: 袁紫衣>]>