零基礎(chǔ)入手Django(八):模型基礎(chǔ)3
今天,小叮當(dāng)來繼續(xù)為大家分享Django的干貨~

主要內(nèi)容有:表的級(jí)聯(lián)刪除、表關(guān)聯(lián)對(duì)象的訪問、表關(guān)聯(lián)對(duì)象的補(bǔ)充、關(guān)系表的數(shù)據(jù)操作和多表查詢。
首先,我們接著昨天所建的項(xiàng)目db_test,為其配置路由
(1)為db_test新建urls.py文件

(2)在主路由中為db_test分配子路由

(3)設(shè)置db_test的views.py定義視圖函數(shù)
(4)在db_test的urls.py中配置對(duì)應(yīng)的路由
(5)在瀏覽器中訪問

(6)通過xshell進(jìn)行查看


可以看到,學(xué)院表和學(xué)生表已成功創(chuàng)建。
一、表的級(jí)聯(lián)刪除
(1)在主表中刪除數(shù)據(jù),對(duì)應(yīng)表中的數(shù)據(jù)也會(huì)被刪除。
例如,將學(xué)院表中的計(jì)算機(jī)學(xué)院刪除,對(duì)應(yīng)學(xué)生表中屬于計(jì)算機(jī)學(xué)院的小叮當(dāng)則也會(huì)被刪除。
重新定義db_test中views.py里的視圖函數(shù)test
在瀏覽器中訪問,使視圖函數(shù)運(yùn)行

通過xshell查看數(shù)據(jù)庫(kù)

可見計(jì)算機(jī)學(xué)院從學(xué)院表中刪除后,與之關(guān)聯(lián)的學(xué)生表中的小叮當(dāng)也被刪除了。
(2)設(shè)置默認(rèn)值為空的級(jí)聯(lián)刪除
當(dāng)我們進(jìn)行級(jí)聯(lián)刪除時(shí),只想刪除主表中的數(shù)據(jù)以及其他表對(duì)它的引用,而不刪除其他表中的數(shù)據(jù)時(shí),該怎么做呢?
例如,我想刪除學(xué)院表中id=2的音樂學(xué)院和學(xué)生表中對(duì)音樂學(xué)院的引用,而不刪除學(xué)生表中的少年叮當(dāng)
首先,我們可以在xshell中進(jìn)入mysql
執(zhí)行 show create table db_test_student\G?查看創(chuàng)建db_test_student表的mysql語(yǔ)句?"\G"表示結(jié)果按列輸出

可以看到,department_id不允許為空
我們?cè)趍odels.py中更改表結(jié)構(gòu),將學(xué)生信息表中的on_delete其設(shè)置為默認(rèn)值為空的級(jí)聯(lián)刪除

具體代碼如下:
(當(dāng)然,如果不想執(zhí)行級(jí)聯(lián)刪除,可以on_delete=models.PROTECT 將其保護(hù)起來)
更改表結(jié)構(gòu)后,執(zhí)行映射等操作。
在Tools中找到Run manage.py Task...

執(zhí)行makemigrations

執(zhí)行migrate

之后在xhell的mysql中再次查看表結(jié)構(gòu),發(fā)現(xiàn)department_id字段已默認(rèn)為空

重新定義db_test中views.py里的視圖函數(shù)test
在瀏覽器中訪問

通過xshell查看數(shù)據(jù)庫(kù)

二、表關(guān)聯(lián)對(duì)象的訪問
1.一對(duì)多關(guān)聯(lián)?學(xué)院表和學(xué)生表
(1)在models.py中重新定義模型類,為學(xué)院表和學(xué)生表加上自定義輸出def __str__(self)
(2)重新定義視圖函數(shù)
(3)在瀏覽器中訪問

(4)在后臺(tái)查看輸出

小結(jié):在學(xué)生表查詢到的學(xué)生信息相當(dāng)于學(xué)生類的實(shí)例對(duì)象,可以直接像訪問成員函數(shù)那樣訪問學(xué)院類中的屬性,以此來實(shí)現(xiàn)表關(guān)聯(lián)對(duì)象的訪問。
值得注意,學(xué)生表關(guān)聯(lián)了學(xué)院表,想查詢學(xué)院有哪些學(xué)生時(shí)就屬于反向查詢了。
反向查詢
(1)直接反向查詢
直接反向查詢,是通過查詢關(guān)鍵字加”_set"來實(shí)現(xiàn)的,例如“student_set",如果表關(guān)系是一對(duì)一,則不加_set也可。
(2)重命名查詢?related_name
通過在模型類中添加related_name的方法,也可進(jìn)行反向查詢

具體代碼如下
此時(shí)進(jìn)行反向查詢時(shí),使用students即可。因?yàn)橄到y(tǒng)中已經(jīng)沒有了student_set屬性,若還按student_set查詢則會(huì)報(bào)錯(cuò)

在視圖函數(shù)中改為用students查詢,即可成功查詢

2.一對(duì)一關(guān)聯(lián)?學(xué)生表和學(xué)生詳細(xì)表
(1)查看學(xué)生信息詳細(xì)表?和學(xué)生表?


(2)models.py中在學(xué)生詳細(xì)模型類中自定義輸出?def__str__(self)
(3)views.py中根據(jù)表字段創(chuàng)建數(shù)據(jù)表
由于學(xué)生詳細(xì)信息表關(guān)聯(lián)的是學(xué)生表,所以在創(chuàng)建學(xué)生詳細(xì)表時(shí),id要從學(xué)生表里現(xiàn)在有的”2、3、4、5“中創(chuàng)建。
在瀏覽器中訪問觸發(fā)視圖函數(shù)

在數(shù)據(jù)庫(kù)中查看

(4)重新定義視圖函數(shù)
(5)在瀏覽器中訪問

(6)在后臺(tái)查看

3.多對(duì)多關(guān)聯(lián)?學(xué)生表和課程表
(1)查詢課程表字段

根據(jù)字段在views.py中為課程表添加數(shù)據(jù)
在瀏覽器中訪問

在數(shù)據(jù)庫(kù)中查看

在models.py中為課程表自定義輸出?def __str__(self)
由于訪問方法和之前的一樣,這里不再演示,在views.py中定義代碼如下
三、表關(guān)聯(lián)對(duì)象的補(bǔ)充
在表關(guān)聯(lián)中的正向查詢是指,一個(gè)表的模型類可以在另個(gè)一表的模型類中找到。
例如,在課程表的模型類中可以直接訪問到學(xué)生表模型類

那么,查詢一門課程所選的學(xué)生就是正向查詢。反之查詢學(xué)生選了哪些課就是反向查詢。

四、關(guān)系表的數(shù)據(jù)操作
1.數(shù)據(jù)的添加
(1)一對(duì)多關(guān)系 add()添加已經(jīng)存在的數(shù)據(jù)? ?create()添加新的數(shù)據(jù)
在views.py中重新定義視圖函數(shù)
在瀏覽器中訪問觸發(fā)視圖函數(shù)

在數(shù)據(jù)庫(kù)中查看

(2)多對(duì)多關(guān)系??add()添加已經(jīng)存在的數(shù)據(jù)? ?create()添加新的數(shù)據(jù)
在views.py中重新定義視圖函數(shù)
在瀏覽器中訪問?觸發(fā)視圖函數(shù)

在數(shù)據(jù)庫(kù)中查找課程表、課程-學(xué)生中間信息表

2.數(shù)據(jù)刪除?remove()?和clear()
(1)remove()
一對(duì)多關(guān)系的表使用remove刪除時(shí),必須保證外鍵列允許為空
例如,學(xué)院表和學(xué)生的對(duì)應(yīng)關(guān)系

多對(duì)多關(guān)系,使用remove刪除,刪除掉的是中間信息表
在視圖函數(shù)中定義
在瀏覽器中訪問

在數(shù)據(jù)庫(kù)中查詢

(2)clear()進(jìn)行清空
使用print查看3號(hào)學(xué)生選了哪些課程
定義視圖函數(shù)
瀏覽器中訪問

后臺(tái)中查看

定義視圖函數(shù)使用clear
瀏覽器中訪問

后臺(tái)查詢

數(shù)據(jù)庫(kù)中查詢中間課程-學(xué)生信息表

可見,clear()會(huì)將符合條件的數(shù)據(jù)全部清空0
五、多表查詢
多表查詢又被稱為是跨關(guān)聯(lián)關(guān)系的查詢。
Django 提供一種強(qiáng)大而又直觀的方式來“處理”查詢中的關(guān)聯(lián)關(guān)系,它在后臺(tái)自動(dòng)幫你處理JOIN。 若要跨越關(guān)聯(lián)關(guān)系,只需使用關(guān)聯(lián)的模型字段的名稱,并使用雙下劃線分隔,直至你想要的字段。
1.重建學(xué)生選課數(shù)據(jù)
在views.py中重新定義視圖函數(shù)
在瀏覽器中訪問?觸發(fā)視圖函數(shù)

在數(shù)據(jù)庫(kù)中查看

2.進(jìn)行多表查詢
在views.py中重新定義視圖函數(shù)
在瀏覽器中查看

在后臺(tái)查看

對(duì)照數(shù)據(jù)庫(kù)進(jìn)行檢驗(yàn)


經(jīng)檢查查詢結(jié)果正確,可見Django的多表查詢結(jié)果是十分便捷的了。