一枢泰、CUD
1 增加
增加數(shù)據(jù)有兩種方法舰攒。
1)save
通過創(chuàng)建模型類對象券敌,執(zhí)行對象的save()方法保存到數(shù)據(jù)庫中扩然。
>>> from book.models import BookInfo,PeopleInfo
>>> 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>
2 修改
修改更新有兩種方法
1)save
修改模型類對象的屬性萍程,然后執(zhí)行save()方法
>>> person = PeopleInfo.objects.get(name='itheima')
>>> person.name = 'itcast'
>>> person.save()
>>> person
<PeopleInfo: itcast>
2)update
使用模型類.objects.filter().update()壮不,會返回受影響的行數(shù)
>>> PeopleInfo.objects.filter(name='itcast').update(name='傳智播客')
1
3 刪除
刪除有兩種方法
1)模型類對象delete
>>> person = PeopleInfo.objects.get(name='傳智播客')
>>> person.delete()
(1, {'book.PeopleInfo': 1})
2)模型類.objects.filter().delete()
>>> BookInfo.objects.filter(name='python入門').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})
二血淌、R
1 基本查詢
get查詢單一結(jié)果,如果不存在會拋出模型類.DoesNotExist異常谓厘。
all查詢多個結(jié)果。
count查詢結(jié)果數(shù)量寸谜。
>>> BookInfo.objects.get(id=1)
<BookInfo: 射雕英雄傳>
>>> BookInfo.objects.get(pk=2)
<BookInfo: 天龍八部>
>>> BookInfo.objects.get(pk=20)
Traceback (most recent call last):
File "<console>", line 1, in <module>
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()
<QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飛狐>]>
>>> BookInfo.objects.count()
2 過濾查詢
實現(xiàn)SQL中的where功能竟稳,包括
filter過濾出多個結(jié)果
exclude排除掉符合條件剩下的結(jié)果
get過濾單一結(jié)果
對于過濾條件的使用,上述三個方法相同,故僅以filter進行講解他爸。
過濾條件的表達語法如下:
屬性名稱__比較運算符=值
屬性名稱和比較運算符間使用兩個下劃線聂宾,所以屬性名不能包括多個下劃線
1)相等
exact:表示判等。
例:查詢編號為1的圖書诊笤。
BookInfo.objects.filter(id__exact=1)
可簡寫為:
BookInfo.objects.filter(id=1)
2)模糊查詢
contains:是否包含系谐。
說明:如果要包含%無需轉(zhuǎn)義,直接寫即可讨跟。
例:查詢書名包含'傳'的圖書纪他。
BookInfo.objects.filter(name__contains='傳')
<QuerySet [<BookInfo: 射雕英雄傳>]>
startswith、endswith:以指定值開頭或結(jié)尾晾匠。
例:查詢書名以'部'結(jié)尾的圖書
BookInfo.objects.filter(name__endswith='部')
<QuerySet [<BookInfo: 天龍八部>]>
以上運算符都區(qū)分大小寫茶袒,在這些運算符前加上i表示不區(qū)分大小寫,如iexact凉馆、icontains薪寓、istartswith、iendswith.
3) 空查詢
isnull:是否為null澜共。
例:查詢書名為空的圖書向叉。
BookInfo.objects.filter(name__isnull=True)
<QuerySet []>
4) 范圍查詢
in:是否包含在范圍內(nèi)。
例:查詢編號為1或3或5的圖書
BookInfo.objects.filter(id__in=[1,3嗦董,5])
<QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 笑傲江湖>]>
5)比較查詢
gt大于 (greater then)
gte大于等于 (greater then equal)
lt小于 (less then)
lte小于等于 (less then equal)
例:查詢編號大于3的圖書
BookInfo.objects.filter(id__gt=3)
不等于的運算符母谎,使用exclude()過濾器。
例:查詢編號不等于3的圖書
BookInfo.objects.filter(id__gt=3)
<QuerySet [<BookInfo: 雪山飛狐>]>
6)日期查詢
year展懈、month销睁、day、week_day存崖、hour冻记、minute、second:對日期時間類型的屬性進行運算来惧。
例:查詢1980年發(fā)表的圖書冗栗。
BookInfo.objects.filter(pub_date__year=1980)
<QuerySet [<BookInfo: 射雕英雄傳>]>
例:查詢1990年1月1日后發(fā)表的圖書。
BookInfo.objects.filter(pub_date__gt='1990-1-1')
<QuerySet [<BookInfo: 笑傲江湖>]>
三供搀、F和Q對象
F對象
之前的查詢都是對象的屬性與常量值比較隅居,兩個屬性怎么比較呢? 答:使用F對象葛虐,被定義在django.db.models中胎源。
語法如下:
F(屬性名)
例:查詢閱讀量大于等于評論量的圖書。
from django.db.models import F
BookInfo.objects.filter(readcount__gt=F('commentcount'))
<QuerySet [<BookInfo: 雪山飛狐>]>
可以在F對象上使用算數(shù)運算屿脐。
例:查詢閱讀量大于2倍評論量的圖書涕蚤。
BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
<QuerySet [<BookInfo: 雪山飛狐>]>
Q對象
多個過濾器逐個調(diào)用表示邏輯與關系宪卿,同sql語句中where部分的and關鍵字。
例:查詢閱讀量大于20万栅,并且編號小于3的圖書佑钾。
BookInfo.objects.filter(readcount__gt=20,id__lt=3)
<QuerySet [<BookInfo: 天龍八部>]>
或者
BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
<QuerySet [<BookInfo: 天龍八部>]>
如果需要實現(xiàn)邏輯或or的查詢,需要使用Q()對象結(jié)合|運算符烦粒,Q對象被義在django.db.models中休溶。
語法如下:
Q(屬性名__運算符=值)
例:查詢閱讀量大于20的圖書,改寫為Q對象如下扰她。
BookInfo.objects.filter(Q(readcount__gt=20))
Q對象可以使用&兽掰、|連接,&表示邏輯與义黎,|表示邏輯或禾进。
例:查詢閱讀量大于20,或編號小于3的圖書廉涕,只能使用Q對象實現(xiàn)
BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
<QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>
Q對象前可以使用~操作符泻云,表示非not。
例:查詢編號不等于3的圖書狐蜕。
BookInfo.objects.filter(~Q(id=3))
<QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>