溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Django和外鍵有什么聯(lián)系嗎

發(fā)布時間:2021-09-06 11:47:07 來源:億速云 閱讀:100 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Django和外鍵有什么聯(lián)系嗎”,在日常操作中,相信很多人在Django和外鍵有什么聯(lián)系嗎問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django和外鍵有什么聯(lián)系嗎”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

注:本文需要你有一定的數(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用在哪里呢?這里說一個地方,在擴展Django的User模型時,因為系統(tǒng)自帶的字段不夠,所以一種最基本的擴展方法是定義一個User_profile表,用來作為用戶的擴展,那么一條用戶記錄只會有一個擴展表記錄,并且這個這個記錄也只屬于該用戶。

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對于圖片的保存采用的是二進制圖片文件存硬盤,數(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)的圖片。

到此,關(guān)于“Django和外鍵有什么聯(lián)系嗎”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI