Django學(xué)習(xí)筆記:ORM的增刪改查

DjangoShell
DjangoShell可以替代來模擬程序運行的過程的環(huán)境,然后可以在這個Shell里面執(zhí)行增刪改查,比較方便,值得注意的是,每次修改代碼都要重新啟動DjangoShell
啟動命令:

可以在djangshell直接操作model層
我比較習(xí)慣念增刪改查。所以本文排班按增刪改查來寫,但是請您如果不幸看到這一篇學(xué)習(xí)筆記,請按CRUD(create read update delete)的順序來閱讀,因為UD都需要用到R的一些方法。以CRUD的順序來閱讀可以降低您閱讀本文章的不悅。


增:

插入為主,獲得對象是其次,比較方便

先構(gòu)建對象為主,插入是其次


刪:
對單個數(shù)據(jù)get()得到后,執(zhí)行對象的delete方法
等于批量數(shù)據(jù)獲取QuerySet后,執(zhí)行QuerySet的delete方法
偽刪除:數(shù)據(jù)是寶貴的,為了保留數(shù)據(jù),我們可以多設(shè)置一個字段is_active來表面是否被刪除,false是刪除,刪除就是把is_active改成false,但是如果使用了偽刪除,那么顯示的地方都需要確保有is_active=true的過濾條件

改:
修改采用一查二改三保存的思路
對單個數(shù)據(jù)的先get(),然后對象.屬性修改,最后對象.save()保存
對一批數(shù)據(jù)則是先獲取QuerySet然后緊接著調(diào)用QuerySet對象的updat方法
update可以實現(xiàn)批量修改和保存。

查:

為了讓查詢結(jié)果更加直觀,我們要重寫模型類的__str__方法,在springboot中這一塊有l(wèi)ombol承包了。

all() 方法相當(dāng)于數(shù)據(jù)庫中的select * from table
得到的是一個對象數(shù)組

values(‘c1’,'c2')方法相當(dāng)于數(shù)據(jù)庫的select? c1,c2 from table
得到是一個字典數(shù)組

values_list(‘c1’,'c2')的作用和效果和values()一致
但是返回的對象是元組數(shù)組,元組的值的應(yīng)用需要索引來提取

order_by()方法相當(dāng)于數(shù)據(jù)庫的select? * from table ORDERBY c1 desc,c2 (asc)
在列名前加-表示降序排序
得到的是一個對象數(shù)組

無論是返回了對象數(shù)組、字典數(shù)組還是元組數(shù)組,都是QuerySet對象
而上面的方法,都是QuerySet的方法,這樣子的設(shè)計可以實現(xiàn)鏈?zhǔn)骄幊?,方法的返回值也是調(diào)用方法的對象類型。
all、values、values_list、order_by,都是可以連續(xù)使用的,而且無論鏈?zhǔn)骄帉懙捻樞蛉绾?,最終都會按mysql的標(biāo)準(zhǔn)自動組裝好,因為這個QuerySet對象的query屬性記錄了這些查詢條件,最終組成了一個sql語句,query的值就是一個sql語句
如下:可以這樣子組合使用

完成一個小練習(xí)鞏固編碼能力


filter()方法相當(dāng)于mysql中的where條件查詢,且默認多個條件之間的關(guān)系是and
返回的是一個對象數(shù)組

exclude()方法相當(dāng)于syq中的where is not 條件查詢,且默認多個條件之間的關(guān)系是and,返回的也是一個對象數(shù)組
get()方法類似于sql的limit 1,但是更像是mybatis的selectone,不同的是,get只搜出一條數(shù)據(jù),且若滿足條件的數(shù)據(jù)有多條,直接報錯。而且若查不到,也報錯
返回的是一個對象,一般都要放在try里面運行。
以上方法只能做相對確定的等值查詢,不能靈活查詢。為此,Django引入了查詢謂詞的定義
查詢謂詞:每一個查詢謂詞都是一個獨立的查詢功能
常見的查詢謂詞:
__contains:包含指定值 XXX,相當(dāng)于?like“%XXX%”;
__startswith:以XXX開始 ,相當(dāng)于 like "XXX%";
__endswith:以XXX結(jié)束,相當(dāng)于like '%XXX';
__gt:大于指定值, __gte大于等于指定值 ,? __it小于 ,__ite:小于等于;
__in 查詢數(shù)據(jù)是否在指定的數(shù)值內(nèi),colname__in=['c1','c2']
__range查詢數(shù)據(jù)會否在是定的元組區(qū)間范圍內(nèi)、colval__range=(10,50)
小練習(xí)

通過這個練習(xí)來熟悉django的代碼編寫,django對個人開發(fā)者很友善,我在這個練習(xí)了算是體會到了。