Django模型關(guān)系
-
1:1
- OneToOneField
- 內(nèi)部實(shí)現(xiàn)
- 使用外鍵,F(xiàn)oreignKey實(shí)現(xiàn)
- 對(duì)外鍵添加了一個(gè)唯一約束
- 數(shù)據(jù)添加
- 主表未添加數(shù)據(jù)而從表添加數(shù)據(jù)時(shí)耕餐,系統(tǒng)會(huì)報(bào)錯(cuò)(1602)違反了唯一性約束
- 報(bào)錯(cuò)后主表添加后凡傅,從表添加時(shí)id變?yōu)橹鞅韎d+(報(bào)錯(cuò)次數(shù))
- 原因是數(shù)據(jù)在存儲(chǔ)時(shí)會(huì)先報(bào)錯(cuò)后判斷,再刪除肠缔,但仍然會(huì)占用id資源
- 數(shù)據(jù)刪除
-
默認(rèn)
- CASECADE
- 當(dāng)聲明關(guān)系的表中數(shù)據(jù)被刪除夏跷,關(guān)聯(lián)表數(shù)據(jù)不會(huì)受影響
- 當(dāng)被關(guān)聯(lián)的表中的數(shù)據(jù)被刪除,關(guān)系表數(shù)據(jù)會(huì)被級(jí)聯(lián)刪除
-
PROTECT(在關(guān)系屬性中設(shè)置)
- 主表數(shù)據(jù)如果存在級(jí)聯(lián)數(shù)據(jù)明未,主表就不能刪除
- 當(dāng)主表數(shù)據(jù)不存在級(jí)聯(lián)數(shù)據(jù)槽华,主表數(shù)據(jù)允許刪除
- 開發(fā)中推薦使用這種方式
-
SET(在一對(duì)一關(guān)系中無法使用,因?yàn)榇嬖谖ㄒ患s束)
- DEFAULT
- NULL
- XXX
-
主從表
- 聲明關(guān)系的就是從表
- 哪張表聲明關(guān)系趟妥,哪張表就相對(duì)來說不重要
-
級(jí)聯(lián)數(shù)據(jù)獲取
-
從表獲取主表
- 通過顯性屬性進(jìn)行獲取
- 顯示屬性是關(guān)系猫态,關(guān)心就是我們關(guān)聯(lián)到的主表的對(duì)象
-
主表獲取從表
隱性屬性(就是關(guān)聯(lián)表的模型名(小寫))
通過隱性屬性獲取
屬性值就是從表的對(duì)象
-
方法二:
- 通過從表對(duì)象獲取
- 從表對(duì)象=模型類.objects.get(隱性id=num)
- 通過關(guān)系查詢往往會(huì)降低查詢性能,所以此方法相當(dāng)于對(duì)數(shù)據(jù)查詢進(jìn)行優(yōu)化
-
-
-
1:M
- ForeignKey
- 內(nèi)部實(shí)現(xiàn)
- 真的就是使用了外鍵實(shí)現(xiàn)的
- 沒有了一對(duì)一的約束
- 刪除數(shù)據(jù)
- 默認(rèn)
- CASECADE
- 主表刪除數(shù)據(jù)披摄,從表級(jí)聯(lián)的所有數(shù)據(jù)消失
- 從表刪除數(shù)據(jù)懂鸵,主表不受影響
- SET_NULL(前提條是字段屬性可以為空,null=Ture)
- 主表刪除數(shù)據(jù)行疏,從表級(jí)聯(lián)的所有數(shù)據(jù)的關(guān)系id變?yōu)閚ull
- SET_DEFAULT(設(shè)置default時(shí)必須設(shè)置存在的pk,一般為系統(tǒng)設(shè)置的默認(rèn)值)
- 主表刪除數(shù)據(jù)套像,從表級(jí)聯(lián)的所有數(shù)據(jù)的關(guān)系id變?yōu)閐efault值
- 數(shù)據(jù)查詢
- 多獲取一
- 使用的顯性屬性酿联,屬性值就是一的對(duì)象
- 可以直接使用
- 一獲取多
- 使用的是隱性屬性
- 一對(duì)象.級(jí)聯(lián)數(shù)據(jù)_set(級(jí)聯(lián)數(shù)據(jù)為級(jí)聯(lián)模型名(小寫)),是一個(gè)Manager的子類RelatedManager對(duì)象
- 可以支持Manager篩選操作
- all( )
- filter( )
- exclude( )
- order_by( )
- Manager支持的操作夺巩,都支持
- 支持 remove(關(guān)系字段允許為空)(必須先獲取后移除贞让,結(jié)果為被刪除學(xué)生的關(guān)系id字段值為null)
- clear
- add(添加時(shí)注意:被添加對(duì)象從objects對(duì)象中用get(pk=num)獲取)
- 多獲取一
-
M:N
- 多對(duì)多
- 使用ManyToManyField
- 如果兩張表的關(guān)系為多對(duì)多柳譬,會(huì)生成額外的第三張表喳张,作為關(guān)系表兩,記錄的是兩張表的pk_id
- 關(guān)系表中 UNIQUE(xx,yy)
- (1,1),(1,2),(1,3)
- (2,1),(2,2),(3,2)
- (2,2)不能添加
- 兩張表的PK_id可以相等美澳,但不能有重復(fù)的添加(特點(diǎn):添加重復(fù)不報(bào)錯(cuò))
- 多對(duì)多也是外鍵實(shí)現(xiàn)的
- 在多對(duì)多的關(guān)系中销部,使用兩個(gè)外鍵實(shí)現(xiàn)
- 主從表各自添加數(shù)據(jù)
- 多對(duì)多模型關(guān)系中主表和從表的添加之間不存在特定關(guān)系
- 從表的關(guān)系屬性數(shù)據(jù)添加不需要指定摸航,故可以忽略
- 從表(聲明關(guān)系的表)添加到主表
- 各自查詢自己的對(duì)象
- 從表對(duì)象.從表關(guān)系屬性不再是單一的主表對(duì)象(可以理解為主表對(duì)象集合)
- 變成了一個(gè)ManyRelatedManager下的對(duì)象
- add( )
- clear( )
- remove( )
- all( )
- filter( )
- exclude( )
- get ( )
- 查詢使用的是顯性屬性
- 主表添加到從表
- 是一個(gè)Manager是隱性屬性
- 主表對(duì)象.從表模型名_set 對(duì)象屬于ManyRelatedManager這個(gè)類 (可以理解為從表對(duì)象的一個(gè)集合對(duì)象)
- add ( )
- all ( )
- remove ( )
- 刪除數(shù)據(jù)
- 不管主表還是從表數(shù)據(jù)刪除,都不會(huì)互相影響
- 刪除自己的數(shù)據(jù)舅桩,并且刪除關(guān)系表中的數(shù)據(jù)
- 多對(duì)多