Django框架ORM數(shù)據(jù)庫操作實(shí)例詳解
本文實(shí)例講述了Django框架ORM數(shù)據(jù)庫操作。分享給大家供大家參考,具體如下:
測試數(shù)據(jù):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(屬性=值) (返回的是受影響的行數(shù))
例:
>>> PeopleInfo.objects.filter(name='itcast').update(name='傳智播客')
四.查詢
1.基本查詢
get:查詢單一結(jié)果,不存在會(huì)拋出DoesNotExist異常。(查詢結(jié)果不是1個(gè)也會(huì)報(bào)錯(cuò))
all:查詢多個(gè)結(jié)果。
count:查詢結(jié)果數(shù)量。
用法:模型類.objects.get/all/count()
2.過濾查詢
filter:過濾出多個(gè)結(jié)果
exclude:排除掉符合條件剩下的結(jié)果
get:過濾出單一結(jié)果
3.過濾條件語法
用法:屬性名稱__比較運(yùn)算符 = 值
exact:相等
例:查詢編號為1的圖書。
BookInfo.objects.filter(id__exact=1)
可簡寫為:
BookInfo.objects.filter(id=1)
contains:包含
例:查詢書名包含'傳'的圖書。
BookInfo.objects.filter(name__contains='傳') <QuerySet [<BookInfo: 射雕英雄傳>]>
startswith/endswith:以指定值開頭/結(jié)尾
例:查詢書名以'部'結(jié)尾的圖書
>>> BookInfo.objects.filter(name__endswith='部') <QuerySet [<BookInfo: 天龍八部>]>
isnull:是否為空
例:查詢書名為空的圖書。
>>> BookInfo.objects.filter(name__isnull=True) <QuerySet []>
in:是否包含在范圍內(nèi)
例:查詢編號為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:時(shí)間日期
例:查詢1980年發(fā)表的圖書。
>>> BookInfo.objects.filter(pub_date__year=1980) <QuerySet [<BookInfo: 射雕英雄傳>]>
4.F對象和Q對象
F對象:用來比較兩個(gè)屬性(使用前需要導(dǎo)入)
用法:F(屬性名)
例:查詢閱讀量大于等于評論量的圖書。
>>> from django.db.models import F >>> BookInfo.objects.filter(readcount__gt=F('commentcount')) <QuerySet [<BookInfo: 雪山飛狐>]>
Q對象:實(shí)現(xiàn)邏輯或or的查詢
用法:Q(屬性名__運(yùn)算符=值),也可在前面加~表示not
例:查詢閱讀量大于20,或編號小于3的圖書
>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3)) <QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>
5.聚合函數(shù)
聚合函數(shù):可使用aggregate()過濾器調(diào)用聚合函數(shù)(Avg,Count,Max,Min,Sum)
用法:模型類.objects.aggregate(聚合函數(shù)(字段名))
例:查詢圖書的總閱讀量。
>>> from django.db.models import Sum >>> BookInfo.objects.aggregate(Sum('readcount')) {'readcount__sum': 126}
返回值為字典類型:{'屬性名__聚合類小寫':值}
注意:使用count一般不用使用過濾器
例:查詢圖書總數(shù)。
BookInfo.objects.count()
返回值為一個(gè)數(shù)字
6.排序函數(shù)
用法:模型類.objects.all().order_by(屬性名)
默認(rèn)升序排序,屬性名前加-為降序
例:
# 默認(rèn)升序 >>> BookInfo.objects.all().order_by('readcount') <QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 笑傲江湖>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]> # 降序 >>> BookInfo.objects.all().order_by('-readcount') <QuerySet [<BookInfo: 雪山飛狐>, <BookInfo: 天龍八部>, <BookInfo: 笑傲江湖>, <BookInfo: 射雕英雄傳>]>
7.關(guān)聯(lián)查詢
一到多的訪問:
用法:一對應(yīng)的模型類對象.多對應(yīng)的模型類名小寫_set
例:查詢id為1的書籍人物
>>> book = BookInfo.objects.get(id=1) >>> book.peopleinfo_set.all() <QuerySet [<PeopleInfo: 郭靖>, <PeopleInfo: 黃蓉>, <PeopleInfo: 黃藥師>, <PeopleInfo: 歐陽鋒>, <PeopleInfo: 梅超風(fēng)>]>
多到一的訪問:
用法:多對應(yīng)的模型類對象.多對應(yīng)的模型類中的關(guān)系類.屬性名
例:查詢id為1的人物的書籍
>>> person = PeopleInfo.objects.get(id=1) >>> person.book.name ‘射雕英雄傳'
關(guān)聯(lián)過濾查詢:
用法:關(guān)聯(lián)模型類名小寫__屬性名__條件運(yùn)算符=值
例:查詢圖書,要求圖書中人物的描述包含"八"
>>> book = BookInfo.objects.filter(peopleinfo__description__contains='八') >>> book <QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>]>
查詢圖書閱讀量大于30的所有人物
>>> people = PeopleInfo.objects.filter(book__readcount__gt=30) >>> people <QuerySet [<PeopleInfo: 喬峰>, <PeopleInfo: 段譽(yù)>, <PeopleInfo: 虛竹>, <PeopleInfo: 王語嫣>, <PeopleInfo: 胡斐>, <PeopleInfo: 苗若蘭>, <PeopleInfo: 程靈素>, <PeopleInfo: 袁紫衣>]>
希望本文所述對大家基于Django的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例
今天小編就為大家分享一篇Python reshape的用法及多個(gè)二維數(shù)組合并為三維數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼
這篇文章主要介紹了python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python標(biāo)準(zhǔn)庫之collections包的使用教程
這篇文章主要給大家介紹了Python標(biāo)準(zhǔn)庫之collections包的使用教程,詳細(xì)介紹了collections中多個(gè)集合類的使用方法,相信對大家具有一定的參考價(jià)值,需要的朋友們下面隨小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-04-04深入淺析NumPy庫中的numpy.diag()函數(shù)
通過本文的介紹,我們深入了解了NumPy庫中numpy.diag()函數(shù)的用法和應(yīng)用,從基本用法到高級特性,再到在線性代數(shù)中的應(yīng)用,我們逐步展示了numpy.diag()在處理對角矩陣和相關(guān)問題時(shí)的強(qiáng)大功能,需要的朋友可以參考下2024-05-05用python標(biāo)準(zhǔn)庫difflib比較兩份文件的異同詳解
今天小編就為大家分享一篇用python標(biāo)準(zhǔn)庫difflib比較兩份文件的異同詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問題
這篇文章主要介紹了linux mint中搜狗輸入法導(dǎo)致pycharm卡死的問題,這篇文章給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Python Numpy教程之排序,搜索和計(jì)數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了Python?NumPy中排序,搜索和計(jì)數(shù)的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-08-08Python實(shí)現(xiàn)統(tǒng)計(jì)文本中字符的方法小結(jié)
在計(jì)算機(jī)編程中,經(jīng)常需要對文本數(shù)據(jù)進(jìn)行處理和分析,字符統(tǒng)計(jì)是其中一個(gè)常見任務(wù),本文將詳細(xì)介紹如何使用Python進(jìn)行字符統(tǒng)計(jì),希望對大家有所幫助2024-01-01