您好,登錄后才能下訂單哦!
這篇文章主要介紹“Django和外鍵有什么聯系嗎”,在日常操作中,相信很多人在Django和外鍵有什么聯系嗎問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django和外鍵有什么聯系嗎”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
注:本文需要你有一定的數據庫知識,本文的數據庫語法使用mysql書寫
Django中,跟外鍵有關的關系有三種,下面來一一介紹。
OneToManyField
這種最好理解,說白了就是最普通的外鍵,看看下面兩個模型:
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`) )
這樣的結果就是一個商品會對應一個類別,即類別是商品的外鍵。
OneToOneField
這種關系和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表,用來作為用戶的擴展,那么一條用戶記錄只會有一個擴展表記錄,并且這個這個記錄也只屬于該用戶。
ManyToMany
多對多關系,這里我們假設一種情景:
我現在有一個商品表,這個商品有一些圖片(不定數量),那么可以使用多對多關系:
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和外鍵有什么聯系嗎”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。