注:本文需要你有一定的資料庫知識,本文的資料庫語法使用mysql書寫
django中,跟外來鍵有關的關係有三種,下面來一一介紹。
這種最好理解,說白了就是最普通的外來鍵,看看下面兩個模型:
class
goodstype
(models.model):
name = models.charfield(max_length=50)
class
goodsmessage
(models.model):
title = models.charfield(max_length='100') # 商品標題
category = models.manytomanyfield(goodstype) # 商品標籤
分析一下:
這裡django會在資料庫中創兩張表:
create
table goodstype(
`id`
int(11) not
null auto_increment,
`name`
varchar(50) not
null,
primary
key (`id`)
)create
table goodsmessage(
`id`
int(11) not
null auto_increment,
`title`
varchar(50) not
null,
`category_id`
int(11) not
null,
primary
key (`id`),
foreign
key (`category_id`) references
`schoolbuy_goodstype` (`id`)
)
這樣的結果就是乙個商品會對應乙個類別,即類別是商品的外來鍵。
這種關係和onetomany類似,是一種有約束的外來鍵,看看下面兩個模型:
class
goodstype
(models.model):
name = models.charfield(max_length=50)
class
goodsmessage
(models.model):
title = models.charfield(max_length='100') # 商品標題
category = models.onetomanyfield(goodstype) # 商品標籤 (變為一對一關係)
他們會使得資料庫建立什麼表呢?
create
table goodstype(
`id`
int(11) not
null auto_increment,
`name`
varchar(50) not
null,
primary
key (`id`)
)create
table goodsmessage(
`id`
int(11) not
null auto_increment,
`title`
varchar(50) not
null,
`category_id`
int(11) not
null,
primary
key (`id`),
foreign
key (`category_id`) references
`schoolbuy_goodstype` (`id`),
unique
key`schoolbuy_goodsmessage_category_id_4dd415fc1e19cf24_uniq` (`category_id`) # 新增
)
那麼這裡已經很明顯了,在這兩個模型裡,每個商品有乙個商品型別,並且每個商品型別只屬於乙個商品(用了unique
約束),即如果我a商品的型別是電腦
,那麼其他商品的型別都不能定義為電腦
了。
所以商品與型別的對應關係肯定不能是onetoone,而應該是onetomany。
那麼onetoone用在**呢?這裡說乙個地方,在擴充套件django的user模型時,因為系統自帶的字段不夠,所以一種最基本的擴充套件方法是定義乙個user_profile表,用來作為使用者的擴充套件,那麼一條使用者記錄只會有乙個擴充套件表記錄,並且這個這個記錄也只屬於該使用者。
class
goodspicture
(models.model):
pic = models.imagefield(upload_to='pic/')
class
goodsmessage
(models.model):
title = models.charfield(max_length='100') # 商品標題
pic = models.manytomanyfield(goodspicture)
這裡資料庫不同啦,建立了三張表,具體如下:
create
table goodspicture(
`id`
int(11) not
null auto_increment,
`pic`
varchar(255) not
null, # django對於的儲存採用的是二進位制檔案存硬碟,資料庫只儲存路徑
primary
key (`id`)
)create
table goodsmessage(
`id`
int(11) not
null auto_increment,
`title`
varchar(50) not
null,
primary
key (`id`)
# 注意了,這裡沒有外來鍵約束了
)create
table goodsmessage_coodspicture(
`id`
int(11) not
null auto_increment,
`goodsmessage_id`
int(11) not
null,
`goodpicture_id`
int(11) not
null,
primary
key (`id`),
unique
key`goodsmessage_id` (`goodsmessage_id`,`goodspicture_id`),
foreign
key (`goodsmessage_id`) references
`goodsmessage` (`id`),
foreign
key (`goodstype_id`) references
`goodspicture` (`id`)
)
前兩個表就不講了,主要說一下第三個表goodsmessage_coodspicture,
django用這個表來記錄一條資料,內容為:某個商品對應某張。其中有乙個unique
約束,說明不能有重複的記錄。
這樣,每次查詢goodsmessage_coodspicture表,就能獲得某件商品對應的。
這裡講了他們在資料庫中的實現,那麼django如何來查詢這些資料呢,有一篇好的博文推薦給大家:
django orm、一對
一、一對多、多對多、詳解
對Django外來鍵關係的描述
注 本文需要你有一定的資料庫知識,本文的資料庫語法使用mysql書寫 django中,跟外來鍵有關的關係有三種,下面來一一介紹。onetomanyfield 這種最好理解,說白了就是最普通的外來鍵,看看下面兩個模型 class goodstype models.model name models.c...
django外來鍵獲取資料
用django寫乙個專案時,使用外來鍵獲取資料遇到乙個問題。models建立的購物車表 class carmodel models.model user models.foreignkey usermodel 關聯使用者 goods models.foreignkey goods 關聯商品 c nu...
django模型中有外來鍵關係的表刪除相關設定
例如有author authordetail兩表 author models.onetoonefield to author null true,related name detail db constraint false,on delete models.cascade 1 關係字段放在auth...