對Django外鍵關(guān)系的描述
注:本文需要你有一定的數(shù)據(jù)庫知識,本文的數(shù)據(jù)庫語法使用mysql書寫
Django中,跟外鍵有關(guān)的關(guān)系有三種,下面來一一介紹。
OneToManyField
這種最好理解,說白了就是最普通的外鍵,看看下面兩個模型:
class GoodsType(models.Model): name = models.CharField(max_length=50) class GoodsMessage(models.Model): Title = models.CharField(max_length='100') # 商品標(biāo)題 Category = models.ManyToManyField(GoodsType) # 商品標(biāo)簽
分析一下:
這里Django會在數(shù)據(jù)庫中創(chuàng)兩張表:
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`) )
這樣的結(jié)果就是一個商品會對應(yīng)一個類別,即類別是商品的外鍵。
OneToOneField
這種關(guān)系和OneToMany類似,是一種有約束的外鍵,看看下面兩個模型:
class GoodsType(models.Model): name = models.CharField(max_length=50) class GoodsMessage(models.Model): Title = models.CharField(max_length='100') # 商品標(biāo)題 Category = models.OneToManyField(GoodsType) # 商品標(biāo)簽 (變?yōu)橐粚σ魂P(guān)系)
他們會使得數(shù)據(jù)庫創(chuàng)建什么表呢?
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`) # 新增 )
那么這里已經(jīng)很明顯了,在這兩個模型里,每個商品有一個商品類型,并且每個商品類型只屬于一個商品(用了UNIQUE約束),即如果我A商品的類型是電腦,那么其他商品的類型都不能定義為電腦了。
所以商品與類型的對應(yīng)關(guān)系肯定不能是OneToOne,而應(yīng)該是OneToMany。
那么OneToOne用在哪里呢?這里說一個地方,在擴(kuò)展Django的User模型時,因為系統(tǒng)自帶的字段不夠,所以一種最基本的擴(kuò)展方法是定義一個User_profile表,用來作為用戶的擴(kuò)展,那么一條用戶記錄只會有一個擴(kuò)展表記錄,并且這個這個記錄也只屬于該用戶。
ManyToMany
多對多關(guān)系,這里我們假設(shè)一種情景:
我現(xiàn)在有一個商品表,這個商品有一些圖片(不定數(shù)量),那么可以使用多對多關(guān)系:
class GoodsPicture(models.Model): Pic = models.ImageField(upload_to='pic/') class GoodsMessage(models.Model): Title = models.CharField(max_length='100') # 商品標(biāo)題 Pic = models.ManyToManyField(GoodsPicture)
這里數(shù)據(jù)庫不同啦,建立了三張表,具體如下:
create table GoodsPicture( `id` int(11) NOT NULL AUTO_INCREMENT, `Pic` varchar(255) NOT NULL, # Django對于圖片的保存采用的是二進(jìn)制圖片文件存硬盤,數(shù)據(jù)庫只保存圖片路徑 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用這個表來記錄一條數(shù)據(jù),內(nèi)容為:某個商品對應(yīng)某張圖片。其中有一個UNIQUE約束,說明不能有重復(fù)的記錄。
這樣,每次查詢GoodsMessage_CoodsPicture表,就能獲得某件商品對應(yīng)的圖片。
這里講了他們在數(shù)據(jù)庫中的實現(xiàn),那么Django如何來查詢這些數(shù)據(jù)呢,有一篇好的博文推薦給大家:
以上這篇對Django外鍵關(guān)系的描述就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python取均勻不重復(fù)的隨機(jī)數(shù)方式
今天小編就為大家分享一篇python取均勻不重復(fù)的隨機(jī)數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Django實現(xiàn)文件分享系統(tǒng)的完整代碼
這篇文章主要介紹了Django實現(xiàn)文件分享系統(tǒng),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
django-crontab 定時執(zhí)行任務(wù)方法的實現(xiàn)
這篇文章主要介紹了django-crontab 定時執(zhí)行任務(wù)方法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
解決python "No module named pip"的問題
今天小編就為大家分享一篇解決python "No module named pip"的問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10

